如何使Wordpress永久链接忽略自定义URL重写

时间:2012-03-15 07:49:00

标签: wordpress url-rewriting locale

我目前正在开发一个wordpress网站,需要选择以法语提供。当我添加一个查询字符串变量l时,我找到了一种方法来使主题与fr_FR po和mo文件一起工作。即。

site.tld将产生香草英文网站,而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;
    }
}
?>

此设置已经有效。我的问题是:我如何重写网址而不是site.tld/?l=fr我可以在文件夹结构前加上fr,即site.tld/fr/

如果有一个英文页面site.tld/portoflio/autumn/,那么site.tld/fr/portfolio/autumn/会吐出法文页面。我从苹果网站得到了这个想法,其中语言总是在文件夹结构之前。

我已经可以通过htaccess中的外部重定向实现这一点:

RewriteBase /
RewriteCond ^[a-z]{2}/
RewriteRule ^([a-z]{2})/(.*)$ /$2?l=$1 [R,L]

这是有效的,但是一旦我删除R标志,它就会提供法语翻译的404未找到的标志。我猜我所做的是搞乱wordpress'重写规则,因为我需要使用漂亮的永久链接。现在我将在管理常规选项中使用Month and name/%year%/%monthnum%/%postname%/)。

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

这甚至可能吗?我在这里走在正确的轨道上吗?我需要你的帮助,特别是做什么是WISE,而不仅仅是什么是NICE。我试过这个http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api但是对于我的生活,我无法使它成功。 :/


更新:好的,所以这里有一些进展从@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停留在地址栏中,所以这是一件好事,但仍存在两个问题:

  1. wordpress正在为我提供主索引页面。好像它没有使用规则的&q=$matches[2]部分;以及

  2. 区域设置仍未正确设置。我检查了变量l是否正在接收,所以我在echo 'l: $l';之后添加$l = get_query_var('l');,有趣的是我得到两个回声:一个l:和另一个l: fr那。是locale过滤器运行两次?似乎第一次它没有看到queryvar的值,然后似乎第二次它输出l:已经在那里fr ..在一天结束时语言环境仍然没有改变。

  3. aaaah帮助。


    最终更新:在我最后一次沮丧的呼吸中,我再次搜索,发现这个插件qtranslate。做我需要的。谢谢你们,特别感谢@ relu的史诗般的努力,并留下了力量。

2 个答案:

答案 0 :(得分:3)

将此添加到您的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 ”查询var,因此您可以通过调用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
}

答案 1 :(得分:0)

可能不在主题但是这里是另一种形式语言的重写规则; en_us /或jp /

add_rewrite_rule( '^([a-z]{2}_[A-Z]{2}|^[a-z]{2})/?$', 'index.php?l=$matches[1]', 'top' );