我目前正在一个wordpress网站上工作,该网站需要以法语提供选项。当我添加一个querystring变量l时,我找到了一种使主题与fr_FR po和mo文件一起使用的方法。 IE。
site.tld将产生 Vanilla 英语站点,而site.tld/?l=fr将激活我的functions.php中的以下代码以提供法语翻译:

<?php
// http://codex.wordpress.org/Plugin_API/Filter_Reference/locale
add_filter( 'locale', 'set_my_locale' );
function set_my_locale( $lang ) {
    if ("fr" == substr(strtolower(trim(strip_tags(stripslashes($_GET['l'])))), 0, 2)) {
        // set language to french
        return "fr_FR";
    } else {
        // return original locale
        return $lang;
    }
}
?>

此设置已经可以使用了。我的问题是:我该如何重写url,而不是site.tld/?l=fr,而只需在文件夹结构中添加frsite.tld/fr/

就像有英文的site.tld/portoflio/autumn/页面一样,site.tld/fr/portfolio/autumn/会吐出法语页面。我是从Apple网站上获得这个想法的,在该网站中,语言始终是文件夹结构的前缀。

我已经可以通过htaccess中的外部重定向来实现这一点:
RewriteBase /
RewriteCond ^[a-z]{2}/
RewriteRule ^([a-z]{2})/(.*)$ /$2?l=$1 [R,L]

这行得通,但是一旦我删除了R标志,它就会提供法语翻译的404 nottead。我猜我所做的是弄乱wordpress的重写规则,因为我需要使用漂亮的永久链接。现在,我在admin常规选项中设置为使用Month and name(/%year%/%monthnum%/%postname%/)。

我的问题是,如何使wordpress忽略/fr/部分,并仍然提供正确的页面/帖子/等?

这有可能吗?我在正确的轨道上吗?我需要您的帮助,特别是在做明智的事情,而不仅仅是做NICE的事情。我尝试了这个http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api,但对于我的一生,我无法使其正常运行。 :/

UPDATE :好的,因此,从下面的@relu获取提示有一些进展:

我确保我的规则来自.htaccess
然后,我通过@relu添加了规则,但采用以下方式,因为Relu总是将我发送到没有/fr的相同地址:
<?
    // http://pmg.co/custom-wordpress-shortlinks
    add_action( 'init', 'pmgtut_add_rewrites' );
    function pmgtut_add_rewrites() {
        add_rewrite_rule( '^([a-z]{2})/?$', 'index.php?l=$matches[1]', 'top' );
        add_rewrite_rule( '^([a-z]{2})/(.*)$', 'index.php?l=$matches[1]&q=$matches[2]', 'top' );
    }
    add_filter( 'query_vars', 'pmgtut_query_vars', 10, 1 );
    function pmgtut_query_vars( $vars ) {
        $vars[] = 'l';
        return $vars;
    }
?>

现在/fr保留在地址栏中,所以这是一件好事,但是仍然存在两个问题:
  • wordpress正在为我提供主索引页面。似乎没有使用规则的&q=$matches[2]部分;和
  • 语言环境仍然设置不正确。我检查了变量l是否被获取,因此我在echo 'l: $l';之后添加了$l = get_query_var('l');,有趣的是,我得到了两个回显:一个l:和另一个l: frlocale过滤器是否运行两次?似乎第一次没有看到queryvar的值,然后似乎第二次输出那里已经有l:fr。在一天结束时,语言环境仍然没有改变。

  • aaaah的帮助。

    最终更新:在我最后的沮丧中,我再次搜索,并发现此插件qtranslate。做了我所需要的。谢谢大家,尤其是@relu的史诗般的努力并留下来。

    最佳答案

    将此添加到您的functions.php

    add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
    add_filter( 'query_vars','my_insert_query_vars' );
    add_action( 'wp_loaded','my_flush_rules' );
    
    // flush_rules() if our rules are not yet included
    function my_flush_rules(){
        $rules = get_option( 'rewrite_rules' );
    
        if ( ! isset( $rules['^([a-z]{2})/(.*)$'] ) ) {
            global $wp_rewrite;
            $wp_rewrite->flush_rules();
        }
    }
    
    // Adding a new rule
    function my_insert_rewrite_rules( $rules )
    {
        $newrules = array();
        $newrules['^([a-z]{2})/(.*)$'] = 'index.php?l=$matches[1]&q=$matches[2]';
        return $newrules + $rules;
    }
    
    // Adding the l var so that WP recognizes it
    function my_insert_query_vars( $vars )
    {
        array_push($vars, 'l');
        return $vars;
    }
    

    尚未测试过,可能需要进行一些调整,但这是这样做的方法。

    我基本上已经修改了here找到的版本。

    它还注册了“ l ”查询变量,因此您可以通过调用get_query_var来获取其值。
    add_filter( 'locale', 'set_my_locale' );
    function set_my_locale( $lang ) {
        $l = get_query_var('l');
    
        if ("fr" == $l) {
            // set language to french
            return "fr_FR";
        } else {
            // return original locale
            return $lang;
        }
    }
    

    UDATE:忽略以上内容!

    删除my_insert_query_vars()过滤器,并将其替换为:
    function register_rewrite_tag() {
            add_rewrite_tag('%l%', '([a-z]{2})');
    }
    add_action('init', 'register_rewrite_tag');
    

    这也是页面和帖子的更新重写,我研究了WordPress的$wp_rewrite->rules并对其进行了调整以适合这种特殊情况:
    function pmgtut_add_rewrites() {
            add_rewrite_rule( '^([a-z]{2})/?$', 'index.php?l=$matches[1]', 'top' );
            add_rewrite_rule( '^([a-z]{2})/(.?.+?)(/[0-9]+)?/?$', 'index.php?l=$matches[1]&pagename=$matches[2]&page=$matches[3]', 'top' ); // Pages
            add_rewrite_rule( '^([a-z]{2})/([^/]+)(/[0-9]+)?/?$', 'index.php?l=$matches[1]&name=$matches[2]&page=$matches[3]', 'top' ); // Posts
    }
    

    关于wordpress - 如何使Wordpress永久链接忽略自定义网址重写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9715704/

    10-13 00:12