我知道可以使用URL参数切换WP语言环境,as described here, 但我正在尝试构建一种完全依赖于自定义“语言”分类法的方法。
我目前拥有的是一个简单的插件,它注册语言分类法,并在存在分类法的情况下实现区域设置切换:
<?php
add_action( \'plugins_loaded\', \'wpsx_register_taxonomies\' );
function wpsx_register_taxonomies() {
register_taxonomy(\'wpsx_language\', array (
0 => \'post\',
1 => \'page\',
), array(
\'hierarchical\' => true,
\'label\' => \'Languages\',
\'singular_label\' => \'Language\',
\'show_ui\' => true,
\'rewrite\' => false,
)
);
}
function wpsx_redefine_locale($locale) {
global $post;
if ( taxonomy_exists( \'wpsx_language\' )) {
$locale = \'de_DE\'; // this does work !!
if ( has_term( \'fr\', \'wpsx_language\' )) {
$locale = \'fr_FR\'; // this does not work yet :(
}
}
return $locale;
}
add_filter(\'locale\',\'wpsx_redefine_locale\',10);
?>
所以不起作用的一小部分是
has_term()
测验我的印象是,语言环境过滤器是在加载序列的早期阶段运行的,此时还没有检索到帖子内容,因此需要进行如下条件测试
is_single()
或
has_term()
不会归还任何东西。
我可以强制提前加载帖子内容吗?我可以延迟区域设置筛选器吗?
我想不出解决这个问题的办法。在wp黑客邮件列表中,建议global $post;
但这没有帮助。
<小时>Update: 按照david的建议。binda,我找到了一个解决方法,放弃了分类法,并使用post slug作为触发器:
function wpsx89972_redefine_locale($locale) {
$wpsx_url = $_SERVER[\'REQUEST_URI\'];
$wpsx_url_lang = substr($wpsx_url, -4); // test for the last 4 chars:
if ( $wpsx_url_lang == "-fr/") {
$locale = \'fr_FR\';
} else if ( $wpsx_url_lang == "-en/") {
$locale = \'en_US\';
} else { // fallback to default
$locale = \'de_DE\';
}
return $locale;
}
add_filter(\'locale\',\'wpsx89972_redefine_locale\',10);
这需要用户重写帖子的slug,例如法语为“my post title fr”,英语为“my post title en”,等等。与使用语言复选框相比,它的用户友好性稍差,但它保持了代码的简单性,并且可以正常工作。
所以现在我有了一个功能性的多语言插件,只需13行代码:)
尽管如此,我还是会把这个问题留待几天,看看是否有人能想出一个利用分类法的解决方案。。。
最合适的回答,由SO网友:david.binda 整理而成
你可能对url_to_postid 作用
从wpsx\\u redefine\\u locale函数中使用如下内容:
$url = $_SERVER[\'REQUEST_URI\'];
$postid = url_to_postid( $url );
请注意,这不会返回自定义帖子类型的帖子id,但函数位于/wp includes/rewrite中。php,如果需要,可以进行扩展。
UPDATE: 这是您的示例:
function my_function(){
if ( ! wp_is_post_revision( $post_id ) ){
// unhook this function so it doesn\'t loop infinitely
remove_action(\'save_post\', \'my_function\');
// update the post, which calls save_post again
$my_post_args = array();
$my_post_args[\'ID\'] = post_id;
$p = get_post( $post_id );
$lang_tax = \'my_lang_tax_name\';
$language_terms = get_post_terms( $post_id, $lang_tax );
$my_post_args[\'post_name\'] = $p->name . \'_\' . $language_terms[0]->slug;
wp_update_post( $my_post_args );
// re-hook this function
add_action(\'save_post\', \'my_function\');
}
add_action(\'save_posts\', \'my_function\');
还需要做些什么,但这取决于你。当用户更改了分配给post的语言分类术语时,您必须清理这种情况,这样您就不会
my-post_de_en
而不是
my-post_en
在de之前的岗位上
my-post_de
鼻涕虫这需要一些正则表达式之类的东西,但您可以管理;)