wordpress - 如何使 Wordpress 永久链接忽略自定义 url 重写

标签 wordpress url-rewriting locale

我目前正在开发一个需要提供法语选项的 wordpress 网站。当我添加查询字符串变量 l 时,我找到了一种使主题与 fr_FR po 和 mo 文件一起使用的方法. IE。
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我可以在文件夹结构前面加上 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 提供服务。我猜我所做的是搞砸了 wordpress 的重写规则,因为我需要使用漂亮的永久链接。现在我准备使用 Month and name ( /%year%/%monthnum%/%postname%/ ) 在管理常规选项中。

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

这甚至可能吗?我在正确的轨道上吗?我需要你的帮助,尤其是做明智的事情,而不仅仅是做美好的事情。我试过这个 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停留在地址栏中,所以这是一件好事,但仍然存在两个问题:
  • wordpress 为我提供主索引页面。似乎它没有使用 &q=$matches[2]规则的一部分;和
  • 语言环境仍然没有正确设置。我检查了变量 l吃饱了,所以我加了 echo 'l: $l';之后 $l = get_query_var('l');有趣的是,我得到了两个回声:一个 l:和另一个 l: fr在那之后。是 locale过滤器运行两次?似乎第一次没有看到 queryvar 的值,然后似乎第二次输出 l:fr已经在那里..在一天结束时,语言环境仍然没有改变。

  • 啊啊啊帮助。

    最终更新 :在我最后一次沮丧中,我再次搜索,并找到了这个插件 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;
        }
    }
    

    日期:无视以上!

    删除 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 永久链接忽略自定义 url 重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715704/

    相关文章:

    Android:应用程序应如何处理设备的语言更改

    wordpress - 如何更改编辑帖子链接的 URL?

    apache - .htaccess - 仅针对一个参数的内部友好 URL 重写

    php - WordPress 两种 custom_post_type 一种分类法

    regex - htaccess 重写适用于所有人,并非有意

    javascript - 在页面刷新之前从 URL 中删除查询字符串

    java - 显示标签格式标签货币

    android - 如何防止使用字符串格式时强制使用默认语言

    php - 按坐标之间的距离过滤 wordpress 帖子

    来自 WPEngine 备份的 Wordpress 项目中的 PHP 解析错误