使用“语言”分类进行区域设置切换

时间:2013-03-08 作者:Manu

我知道可以使用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行代码:)

尽管如此,我还是会把这个问题留待几天,看看是否有人能想出一个利用分类法的解决方案。。。

2 个回复
最合适的回答,由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 鼻涕虫这需要一些正则表达式之类的东西,但您可以管理;)

SO网友:Fahad Alduraibi

这里有一个更好的解决方案,它不会改变你帖子中的任何内容,只会添加一个meta

// Set the post language when loading up the page based on the store meta
function ppl_set_post_language() {
    $postID = url_to_postid( $_SERVER["REQUEST_URI"] );
    if ($postID > 0) {
        $postLanguage = esc_attr( get_post_meta( $postID, \'_ppl_post_language\', true ) );
        if ( ! empty( $postLanguage ) ) {
            global $locale;
            $locale = $postLanguage;
        }
    }
}
// Any call to \'url_to_postid\' earlier then \'setup_theme\' will generate a fatal error.
add_action(\'setup_theme\', \'ppl_set_post_language\');
有关更多详细信息,请查看我的答案(关于我自己的问题):Set language per post

我有一个插件,可以为您制作一切(链接也在我的答案中)

结束

相关推荐

How to change language?

很抱歉,这是一个完整的新手问题,但我在谷歌上搜索了它,找不到这个简单的信息。我今天刚安装了Wordpress。现在我的Wordpress博客上的所有文字都是英文:“Home”、“About”、“Comments”等。我怎样才能改变语言?更新:事实上,我还没有走出困境。我有:找到fr\\u fr.mo文件并将其复制到新目录“/wp content/languages/”中修改了wp配置。php文件中包含以下行:定义(\'WPLANG\',\'fr\\u fr\');不幸的是,我仍然得到英文界面。任何帮助都将