【问题标题】:How to make Wordpress permalinks ignore custom url rewrite如何使 Wordpress 永久链接忽略自定义 url 重写
【发布时间】:2012-03-31 17:21:38
【问题描述】:

我目前正在开发一个需要提供法语选项的 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;
    }
}
?>

此设置已在运行。我的问题是:我如何重写 url,而不是 site.tld/?l=fr 我可以在文件夹结构前面加上 frsite.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 not found istead。我猜我所做的是弄乱了 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 正在为我提供主索引页面。似乎它没有使用规则的&amp;q=$matches[2] 部分;和

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

啊啊帮助。


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

【问题讨论】:

    标签: wordpress url-rewriting locale


    【解决方案1】:

    将此添加到您的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-&gt;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
    }
    

    【讨论】:

    • 哇,对不起,我刚看到这个。谢谢!!好的,所以当我添加这些时,他们只是带我回到链接,没有/fr 嗯.. 有什么想法吗?我一无所知的atm
    • 您是否从 .htaccess 中删除了这些规则?不需要它们!
    • 是的,这样做了.. 我还确保只有 wordpress 的 rwrules 在那里.. 当我开始工作时会尽快通知你。与此同时,我也知道是否还有其他我们可以做的。非常感谢,'感谢它,伙计!
    • 问题:&amp;q=$matches[2] 中的q 是什么意思?
    • 嘿@relu 请在问题末尾检查我的更新。谢谢咀嚼
    【解决方案2】:

    也许题外话了,但是这里有另外一条针对这种形式的语言的重写规则; en_us/ 或 jp/

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2016-06-14
      相关资源
      最近更新 更多