问题描述
我想写自己的小插件进行语言切换。为此,第一件事是让重写规则运行。我一直在网路上看了 2 个小时,但是我找不到我的问题的答案。
我想这样做:http://www.mysite.com/de/post-title/
或 http://www.mysite.com/de/projects/project-title/
所以基本上,我想要做的是保留当前的 url 和所有的参数,只需在站点 URL 和路径之间添加当前活动的语言片断。这是我的代码到目前为止
function rewrite_rule_de(){
add_rewrite_tag('%lang%','([^&]+)');
add_rewrite_rule('^de/(.+?)/?$', 'index.php?p=$matches[1]&lang=de', 'bottom');
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
add_action('init', 'rewrite_rule_de');
最佳解决方案
我现在得到了,搜索了很多资源后:
function lang_support() {
return array('en','fr'); // Add your support lang-code (1st place is a default)
}
function rewrite_lang(){
$langs = lang_support();
foreach($langs as $lang) {
add_rewrite_endpoint($lang,EP_PERMALINK|EP_PAGES|EP_ROOT|EP_CATEGORIES);
}
}
add_action('init','rewrite_lang');
function lang(){
global $wp_query;
$langs = lang_support();
$lang_r = "";
foreach($langs as $lang) {
if(isset($wp_query->query_vars[$lang])) {
$lang_r = $lang;
$_SESSION['lang'] = $lang_r;
}
}
if(in_array($lang_r,$langs)) {
return $lang_r;
} else {
return $langs[0];
}
}
function init_session(){session_start();}
add_action('init','init_session',1);
function lang_session() { // Redirect by JS if session is set
$url_lang= basename($_SERVER['REQUEST_URI']);
if(!in_array($url_lang,lang_support()) && isset($_SESSION['lang'])) {
if(!is_404()) {
wp_redirect(currentURL().$_SESSION['lang'],301);
exit;
}
}
}
add_action('wp_head','lang_session');
function output_buffer() {ob_start();}
add_action('init','output_buffer');
function currentURL() {
$pageURL=(@$_SERVER["HTTPS"]=="on")?"https://":"http://";
if($_SERVER["SERVER_PORT"]!="80"){
$pageURL.=$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}else{
$pageURL.=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
将此代码添加到 functions.php
中。加入代码后转到 wp-admin/options-permalink.php
并按 Save Changes
所以现在你可以检查/使用你的模板中的 lang 代码,如..
<?php echo lang();?>
或 if( lang() === "en" )
我的示例代码示例工作网址:
http://domain.com/ <-- "en"
http://domain.com/en/ <-- "en"
http://domain.com/fr/ <-- "fr"
http://domain.com/es/ <-- "en" (coz , "es" code not set)
http://domain.com/mypage/ <-- "en" (work with "page")
http://domain.com/mypage/fr/ <-- "fr"
http://domain.com/mypage/es/ <-- "en" (coz , "es" code not set)
http://domain.com/mypost/ <-- "en" (work with "post")
http://domain.com/mypost/fr/ <-- "fr"
http://domain.com/mypost/es/ <-- "en" (coz , "es" code not set)
更好的想法/错误修复器/发现错误+错误? https://gist.github.com/l2aelba/5244912
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。