WPML
apply_filters( 'wpml_active_languages', mixed $empty_value, array|string $args )
Тип
filter
Версия WPML
3.2

Описание

Фильтрует список языков, включенных (активных) для сайта. Этот фильтр обычно используется для создания пользовательских переключателей языков.

Этот фильтр может работать только после того, как был инициализирован глобальный объект $wp_query. Это означает, что его следует вызывать после выполнения действия wp.

WPML возвращает активные (включенные) языки сайта в виде массива с информацией о каждом языке. Приведенный ниже пример взят с сайта на WPML 5.0. Его язык по умолчанию — английский (США), немецкий доступен по адресу /de-de/, а арабский — по адресу /ar/:

Array
(
 [en-us] => Array
  (
   [id] => 1
   [active] => 1
   [default_locale] => en_US
   [native_name] => English (United States)
   [missing] => 0
   [translated_name] => English (United States)
   [language_code] => en-us
   [country] => US
   [display_code] => en-us
   [country_flag_url] => https://example.com/wp-content/plugins/sitepress-multilingual-cms/res/flags/country/us.svg
   [url] => https://example.com/about
  )

 [de] => Array
  (
   [id] => 3
   [active] => 0
   [default_locale] => de_DE
   [native_name] => Deutsch
   [missing] => 0
   [translated_name] => German
   [language_code] => de
   [country] => DE
   [display_code] => de-de
   [country_flag_url] => https://example.com/wp-content/plugins/sitepress-multilingual-cms/res/flags/country/de.svg
   [url] => https://example.com/de-de/ueber-uns
  )

 [ar] => Array
  (
   [id] => 30
   [active] => 0
   [default_locale] => ar
   [native_name] => العربية
   [missing] => 0
   [translated_name] => Arabic
   [language_code] => ar
   [country] => 
   [display_code] => ar
   [country_flag_url] => https://example.com/wp-content/plugins/sitepress-multilingual-cms/res/flags/language/ar.svg
   [url] => https://example.com/ar/about
  )
)
Считывайте адрес языка из url. Никогда не формируйте его из language_code. Вышеуказанный немецкий язык имеет код de и адрес /de-de/. WPML уточняет URL-код, когда Вы добавляете две страны для одного языка за один шаг, владелец сайта также может его изменить, а в режиме разных доменов адресом является домен, введенный владельцем.

Ключи в WPML 5.0

  • language_code — это сохраненный код. Язык, который привязан к стране, содержит эту страну в коде, например en-us или de-at. Немецкий, испанский, французский, итальянский и нидерландский сохраняют простой код для своей родной страны (de, es, fr, it, nl). Португальский и китайский всегда содержат страну. Арабский и другие языки одной страны не содержат ее. Язык сохраняет код, с которым был создан, поэтому сайт, перешедший на новую версию, может использовать en там, где новый сайт использует en-us.
  • country — это код страны для языка. Он пуст для языка без страны.
  • display_code — это код, который WPML использует в URL-адресах. Он отличается от language_code, если WPML уточняет код или если владелец сайта изменяет его. Чтобы прочитать эту же карту в собственном коде, используйте фильтр wpml_language_codes_map.
  • country_flag_url — это URL-адрес флага. Это пустая строка, когда сайт показывает код языка вместо флага, поэтому проверяйте значение перед его выводом. Собственные флаги WPML — это res/flags/country/<country>.svg для языка со страной и res/flags/language/<code>.svg для языка без нее. Пользовательский флаг загружается из папки uploads. Никогда не формируйте путь самостоятельно: res/flags/sv.svg — это флаг Швеции, а res/flags/country/sv.svg — флаг Сальвадора.

На сайте, который не завершил переход на новую версию WPML, country может иметь значение NULL, а display_code может отсутствовать. Используйте isset() перед их чтением.

Фильтр wpml_active_languages предоставляет возможность выполнять такие действия, как изменение порядка в массиве языков. Или что-то более сложное, например, перенаправление отсутствующих языков на пользовательский URL-адрес.

Аргументы

$empty_value
(mixed) (Обязательно) Обычно это значение, которое будет изменять фильтр. Здесь мы ничего не фильтруем, поэтому установите значение NULL. Это нужно для того, чтобы функция фильтра действительно получила полный список аргументов.
$args
(array|string) (Необязательно) Аргументы для фильтрации вывода языков.
  • skip_missing(bool) Как обрабатывать языки без переводов. 1, чтобы пропустить язык, или 0, чтобы дать ссылку на главную страницу языка для отсутствующих переводов.
  • link_empty_to(string) Работает вместе со skip_missing = 0 и позволяет использовать пользовательские ссылки для языков, у которых нет переводов для текущего элемента. {%lang} можно использовать в качестве заполнителя для кода языка. По умолчанию пусто.
  • orderby(string) Принимает id|code|name. По умолчанию — custom. Пользовательский порядок можно задать в админ-панели WordPress в разделе WPML » Настройки » Переключатели языков » Параметры переключателя языков.
  • order(string) Принимает asc|desc.

Пример использования

Не забывайте экранировать любой вывод. Дополнительную информацию о передовых методах см. на странице об очистке/экранировании данных.

Аргументы фильтра можно передать в виде строки, как показано в первом примере ниже. Их также можно передать в виде массива, как показано во втором примере далее.

В приведенном ниже примере мы отображаем переключатель языков только с флагами. Однако есть небольшое отличие от переключателя языков только с флагами, который Вы можете настроить в «Настройках языков WPML» в админ-панели.

Разница здесь в том, что текущий язык не будет обернут в тег ссылки. Ссылки будут иметь только альтернативные языки страницы. Взгляните.

Пример
function my_flag_only_language_switcher() {
    $languages = apply_filters( 'wpml_active_languages', NULL, 'orderby=id&order=desc' );

    if ( !empty( $languages ) ) {
        foreach( $languages as $l ) {
            if ( !$l['active'] ) echo ' <a href="' . esc_url( $l['url'] ) . '">';
            if ( '' !== $l['country_flag_url'] ) {
                echo '<img src="' . esc_url( $l['country_flag_url'] ) . '" height="12" alt="' . esc_attr( $l['language_code'] ) . '" width="18" />';
            } else {
                echo esc_html( $l['language_code'] );
            }
            if ( !$l['active'] ) echo '</a> ';
        }
    }
}

В следующем примере ниже мы перенаправляем отсутствующие языки на пользовательскую страницу, где отображаем контактную форму, чтобы пользователи могли уведомить администратора сайта о непереведенном контенте.
Мы также переводим в верхний регистр название активного языка, то есть языка, который мы просматриваем в данный момент, используя функцию PHP strtoupper.
Второй пример
function my_custom_language_switcher() {
    $languages = apply_filters( 'wpml_active_languages', NULL, array( 'skip_missing' => 0, 'link_empty_to' => 'http://domain.com/missing-translation-contact-form' ) );

    if( !empty( $languages ) ) {
        foreach( $languages as $language ){
			$native_name = $language['active'] ? strtoupper( $language['native_name'] ) : $language['native_name'];

            if( !$language['active'] ) echo '<a href="' . esc_url( $language['url'] ) . '">';
            echo esc_html( $native_name ) . ' ';
            if( !$language['active'] ) echo '</a>';
        }
    }
}

wpml_decode_custom_field, wpml_footer_language_selector, wpml_add_language_form_field, wpml_ls_exclude_in_menu, wpml_is_rtl, wpml_alternate_hreflang, wpml_head_langs, wpml_must_translate_canonical_url, wpml_browser_redirect_language_params, wpml_encode_custom_field

Все хуки из категории «Информация о языках для всего сайта» (30)