do_action( 'wpml_switch_language', string|null $language_code )
- 类型
- action
- 类别
- 获取内容的语言信息
- WPML 版本
- 3.2.2
说明
此动作钩子用于设置 WPML 用来筛选数据库查询的语言。它的作用类似于一个作用域:语言代码开启作用域,而 null 将其关闭。
切换可以嵌套。从 WPML 5.0 开始,WPML 将处于开启状态的切换保留在堆栈中。每次带有语言代码的调用都会开启一个新的作用域。带有 null 的调用会关闭最后一个仍处于开启状态的作用域,并将语言交还给周围的代码。因此,null 会恢复您自己切换的语言,而不是请求开始时的语言。只有当您的切换是唯一开启的切换时,两者才相同。当没有作用域处于开启状态时,WPML 会回退到请求在第一次切换之前的语言。
每次切换都需要有自己的恢复操作。将每个开启作用域的调用与一个传递 null 的调用配对。将恢复操作放在 finally 区块中,以便在您的代码抛出异常时它也会运行。如果您让作用域保持开启状态,请求的其余部分将以您的语言运行,并且 WPML 会一直报告语言已切换。
不要通过指定原来的语言名称来进行恢复。语言代码始终会开启一个作用域。WPML 从不将其视为恢复操作。像 do_action( 'wpml_switch_language', $previous_language ) 这样的调用会开启第二个作用域,而不是关闭第一个。这很难被发现,因为在这对调用之后,当前语言是正确的。问题会出现在请求的后续过程中:您保持开启的作用域会被周围的下一个恢复操作关闭,然后该代码就会在错误的语言下运行。电子邮件、REST 响应和管理后台屏幕通常会显示此问题。这种模式在 WPML 4.x 中是正确的,该版本使用一个共享槽位而不是堆栈。如果您的插件仍在使用它,请参阅通过名称恢复语言会使 WPML 保持切换状态。
一次更改一个查询。在切换和恢复之间运行您的查询。不要在 pre_get_posts 中切换语言:该回调在查询运行之前结束,因此您将没有地方关闭作用域。
参数
- $language_code
- (字符串|null)(可选)要切换到的语言。使用活动语言的 2 个字母(或更长)代码,或使用“all”查询所有活动语言的内容。每个语言代码都会打开一个新的语言作用域。传递
null以关闭由您自己的切换所打开的作用域。默认为 null
只有 null 才能关闭作用域。空字符串、false 和 0 会像任何其他值一样打开一个作用域。它们不会改变语言,因此在此时看起来没有任何问题,但作用域会保持打开状态。在传递语言代码之前,请检查其是否为空。
使用示例
示例
打开一个语言作用域,在其中运行您的工作,并在
finally 区块中关闭该作用域。当您的代码抛出异常时,finally 区块也会运行。
// Get the 5 latest German posts, then give the language back.
do_action( 'wpml_switch_language', 'de' );
try {
$german_posts = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
) );
} finally {
// Closes the scope that the call above opened.
do_action( 'wpml_switch_language', null );
}
不要通过指定语言来恢复
这种模式在 WPML 4.x 中是正确的。从 WPML 5.0 开始,这是一个缺陷:第二次调用会打开第二个作用域,而不是关闭第一个作用域。
$current = apply_filters( 'wpml_current_language', null ); do_action( 'wpml_switch_language', 'de' ); // ... do_action( 'wpml_switch_language', $current ); // Wrong: this opens a new scope.
相关钩子
wpml_post_language_details, wpml_switch_language_for_email, wpml_restore_language_from_email, wpml_element_language_code, wpml_element_language_details