|string $atts Атрибуты шорткода. */ public function shortcode( $atts ): string { $atts = shortcode_atts( array( 'show_current' => 'yes', 'type' => 'list', ), is_array( $atts ) ? $atts : array(), self::SHORTCODE ); return $this->render( 'no' !== strtolower( (string) $atts['show_current'] ), 'dropdown' === strtolower( (string) $atts['type'] ) ); } /** * Собирает разметку переключателя. * * @param bool $showCurrent Показывать ли текущий язык. * @param bool $asDropdown Отдать выпадающим списком вместо ссылок. */ public function render( bool $showCurrent = true, bool $asDropdown = false ): string { $languages = $this->settings->published(); if ( count( $languages ) < 2 ) { return ''; } $current = $this->resolver->current(); $mode = $this->settings->switcherDisplay(); $items = array(); foreach ( $languages as $language ) { $isCurrent = $language->locale === $current->locale; if ( $isCurrent && ! $showCurrent ) { continue; } $items[] = array( 'url' => $this->urlFor( $language ), 'markup' => Flags::switcherMarkup( $language, $mode ), 'text' => Flags::switcherText( $language, $mode ), 'name' => $language->label, 'lang' => $language->bcp47(), 'current' => $isCurrent, ); } if ( array() === $items ) { return ''; } return $asDropdown ? $this->renderDropdown( $items ) : $this->renderList( $items ); } /** * Адрес, на который ведёт ссылка языка. * * Если эта страница на нужном языке скрыта (владелец не включил запись * для языка), ссылка на неё привела бы к редиректу на русский — посетитель * нажал «English» и остался на русском. Вместо этого ведём на главную * нужного языка. * * @param \LingoCanvas\Settings\Language $language Целевой язык. */ private function urlFor( \LingoCanvas\Settings\Language $language ): string { if ( null !== $this->pageLanguages && $this->pageLanguages->isHiddenOn( $language ) ) { return $this->urls->homeFor( $language ); } return $this->urls->switchUrlFor( $language ); } /** * Список ссылок. * * @param list $items Языки. */ private function renderList( array $items ): string { $html = ''; } /** * Выпадающий список: переход выполняет крошечный инлайн-обработчик. * * @param list $items Языки. */ private function renderDropdown( array $items ): string { $html = sprintf( ''; } }