【发布时间】: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 我可以在文件夹结构前面加上 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 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 保留在地址栏中,这是一件好事,但仍然存在两个问题:
wordpress 正在为我提供主索引页面。似乎它没有使用规则的
&q=$matches[2]部分;和语言环境仍然没有正确设置。我检查了变量
l是否被输入,所以我在$l = get_query_var('l');之后添加了echo 'l: $l';,有趣的是我得到了两个回声:一个l:和另一个l: fr紧随其后。locale过滤器是否运行了两次?似乎第一次它没有看到查询变量的值,然后似乎第二次输出l:和fr已经在那里.. 在一天结束时,语言环境仍然没有'不要改变。
啊啊帮助。
最终更新:在我最后一次沮丧中,我再次搜索,发现了这个插件 qtranslate。做我需要的。谢谢你们,特别是@relu 的史诗般的努力和留下来的力量。
【问题讨论】:
标签: wordpress url-rewriting locale