WPML
apply_filters( 'wpml_active_languages', mixed $empty_value, array|string $args )
类型
filter
WPML 版本
3.2

说明

过滤为网站启用的(活动的)语言列表。此过滤器通常用于创建自定义语言切换器。

仅当全局 $wp_query (在新标签页中打开) 对象实例化后,此过滤器才能工作。这意味着它应在 wp action (在新标签页中打开) 发生后调用。

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
  )
)

WPML 5.0 中的键

  • language_code 是存储的代码。带有国家/地区的语言会在代码中包含该国家/地区,例如 en-us 或 de-at。德语、西班牙语、法语、意大利语和荷兰语为其本国保留纯代码(de、es、fr、it、nl)。葡萄牙语和中文始终带有国家/地区。阿拉伯语和其他单国家/地区语言不带国家/地区。语言会保留其创建时的代码,因此升级的网站可以使用 en,而新网站使用 en-us。
  • country 是语言的国家/地区代码。对于没有国家/地区的语言,它为空。
  • display_code 是 WPML 在 URL 中使用的代码。当 WPML 限定代码或网站所有者编辑它时,它与 language_code 不同。要在您自己的代码中读取相同的映射,请使用 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 个 全站语言信息 钩子