重写多语言网站的规则,比如qTranslate?

时间:2012-07-30 作者:rassoh

我想为语言切换编写自己的小插件。为此,第一件事就是运行重写规则。我已经在网上搜索了两个小时,但我还没有找到我的问题的答案。

我希望它是这样的:http://www.mysite.com/de/post-title/http://www.mysite.com/de/projects/project-title/

所以基本上,我要做的是保留当前url及其所有参数,只需在站点url和路径之间添加当前活动的语言片段。以下是我目前的代码:

function rewrite_rule_de(){
    add_rewrite_tag(\'%lang%\',\'([^&]+)\');
    add_rewrite_rule(\'^de/(.+?)/?$\', \'index.php?p=$matches[1]&lang=de\', \'bottom\');
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action(\'init\', \'rewrite_rule_de\');

1 个回复
最合适的回答,由SO网友:l2aelba 整理而成

在搜索了许多资源后,我现在找到了它:

function lang_support() {
    return array(\'en\',\'fr\'); // Add your support lang-code (1st place is a default)
}

function rewrite_lang(){
    $langs = lang_support();
    foreach($langs as $lang) {
        add_rewrite_endpoint($lang,EP_PERMALINK|EP_PAGES|EP_ROOT|EP_CATEGORIES);
    }
}
add_action(\'init\',\'rewrite_lang\');

function lang(){
    global $wp_query;
    $langs = lang_support();
    $lang_r = "";
    foreach($langs as $lang) {
        if(isset($wp_query->query_vars[$lang])) {
            $lang_r = $lang;
            $_SESSION[\'lang\'] = $lang_r;
        }
    }
    if(in_array($lang_r,$langs)) {
        return $lang_r;
    } else {
        return $langs[0];
    }
}

function init_session(){session_start();}
add_action(\'init\',\'init_session\',1);

function lang_session() { // Redirect by JS if session is set
    $url_lang= basename($_SERVER[\'REQUEST_URI\']);
    if(!in_array($url_lang,lang_support()) && isset($_SESSION[\'lang\'])) {
        if(!is_404()) {
          wp_redirect(currentURL().$_SESSION[\'lang\'],301);
          exit;
        }
    }
}
add_action(\'wp_head\',\'lang_session\');

function output_buffer() {ob_start();}
add_action(\'init\',\'output_buffer\');

function currentURL() {
    $pageURL=(@$_SERVER["HTTPS"]=="on")?"https://":"http://";
        if($_SERVER["SERVER_PORT"]!="80"){
            $pageURL.=$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        }else{
            $pageURL.=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $pageURL;
}
将此代码添加到functions.php. After added code 转到wp-admin/options-permalink.php 然后按Save Changes

因此,现在您可以在模板中检查/使用lang代码,如。。

<?php echo lang();?>

if( lang() === "en" )

示例工作URL和示例代码:

http://domain.com/ <-- "en"
http://domain.com/en/ <-- "en"
http://domain.com/fr/ <-- "fr"
http://domain.com/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypage/ <-- "en" (work with "page")
http://domain.com/mypage/fr/ <-- "fr"
http://domain.com/mypage/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypost/ <-- "en" (work with "post")
http://domain.com/mypost/fr/ <-- "fr"
http://domain.com/mypost/es/ <-- "en" (coz , "es" code not set)
更好的想法/错误修复程序/发现错误+错误?https://gist.github.com/l2aelba/5244912

结束

相关推荐

widgetlogic and permalinks

我试图使用widgetlogic在某些页面上有条件地显示菜单。每个菜单都使用如下标记is_page(array(\"Page Name\", \"Page Name 2\" ...)), 在我尝试更改permalinks之前,它一直工作得很好(因此所有菜单都会从各自的页面中消失)。我做错什么了吗?是否有解决方法?