2012-03-15 107 views
5

我目前正在一个WordPress的网站,需要有法国提供的选项。我找到了一种方法来使主题与fr_FR po和mo文件一起工作,当我添加查询字符串变量l。即如何让WordPress的永久链接忽略自定义URL重写

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 isntead。我猜我所做的是与wordpress的重写规则搞混了,因为我需要使用漂亮的固定链接。现在我在管理员常规选项中设置为使用Month and name/%year%/%monthnum%/%postname%/)。

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

这甚至有可能吗?我在正确的轨道上吗?我需要你的帮助,尤其是做WISE,而不仅仅是NICE。我试过这个http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api,但对于我的生活,我不能让它工作。 :/


UPDATE:好了,所以这里的一些进展,采取线索,从@relu如下:

我确信我的规则是从.htaccess

罐头然后,我添加的规则从@因为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是否得到了喂养,所以我在$l = get_query_var('l');之后加了echo 'l: $l';,有趣的是我得到了两个回声:一个l:和另一个l: frlocale过滤器正在运行两次?看起来像是第一次没有看到queryvar的值,然后似乎第二次输出l:fr已经在那里..在一天结束时,区域设置仍然不会改变。

aaaah help。


最后更新:在我沮丧的最后一口气我再次搜索,发现这个插件qtranslate。做我所需要的。谢谢你们,尤其是@ relu的史诗般的努力,还有stayin pow'r。

回答

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

它还注册 “” 查询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 
} 
+0

哇对不起,我刚刚看到这个。谢谢!!好吧,所以当我添加这些,他们只是带我回到没有'/ fr'的链接嗯..任何想法? am clueless atm – 2012-03-18 11:40:03

+0

您是否从.htaccess中删除了这些规则?他们不需要! – relu 2012-03-18 16:31:42

+0

yeap,这样做..我也确保只有WordPress的rwrules在那里..当我得到它的工作时,会让你知道尽快。同时让我们知道如果还有其他事情我们可以做。非常感谢,'让它变得好人! – 2012-03-19 06:30:59

0

也许脱离主题,但这里有另一个表单语言的重写规则; en_us /或jp/

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