我目前正在一个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
,而只需在文件夹结构中添加fr
即site.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
保留在地址栏中,所以这是一件好事,但是仍然存在两个问题:&q=$matches[2]
部分;和l
是否被获取,因此我在echo 'l: $l';
之后添加了$l = get_query_var('l');
,有趣的是,我得到了两个回显:一个l:
和另一个l: fr
。 locale
过滤器是否运行两次?似乎第一次没有看到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/