如何使用重写规则或重写端点来切换语言?

时间:2016-09-06 作者:buckdanny

目标是使其工作:

www.pageurl。de->无任何事情发生

www.pageurl。de/en/>变量设置并存储在cookie中

这还需要与永久链接、类别等一起使用,例如:

www.pageurl。de/en/linktopost/

www.pageurl。de/en/类别名称/

我试着与add_rewrite_endpoint(\'en\',EP_PERMALINK|EP_PAGES|EP_ROOT|EP_CATEGORIES);

但是端点(这很有意义)只在url的末尾起作用

我也试着与

$language="en"; add_rewrite_rule(\'^\' . $language . \'/([^/]*)/?$\', \'index.php?lang=$matches[1]\', \'top\'); 但是www.pageurl。de/en/仅返回404

最好的方法是什么?

我需要在整个页面的url中有语言模式,比如在菜单中更改页面后,“en”必须在url中。

1 个回复
最合适的回答,由SO网友:maxime schoeni 整理而成

您不能仅仅通过添加重写规则来实现这一点,您需要更改每个记录的规则。

以下是一种简单的方法:

function my_rewrite_rules($rules) {

    $new_rules = array();

    $new_rules[\'(?:de|en)/?$\'] = \'index.php\';

    foreach ($rules as $key => $val) {

        $key = \'(?:de|en)/?\' . $key;

        $new_rules[$key] = $val;

    }

    return $new_rules;
}

add_filter(\'rewrite_rules_array\', \'my_rewrite_rules\', 11);
现在,您仍然需要一种方法来接收语言值,以便将其保存在cookie中。

您可以为该语言添加一个参数,以便在$_GET 超级全球。但这意味着要抵消所有其他规则的所有其他参数,这将涉及大量正则表达式。

相反,您可以通过查询$_SERVER 全球:

preg_match(\'/\\/(de|en)(\\/|$|\\?|#)/\', $_SERVER[\'REQUEST_URI\'], $matches);

相关推荐

multi-language WordPress site

我正在制作由WordPress支持的多语言网站。WPML 不是免费的,而且它对数据库进行了太多额外的sql查询,所以对于我的站点来说,这不是一个好的解决方案。qTranslate 将所有语言保存在一个数据库行中,以后移动到另一个多语言插件非常复杂。<?php _e( \'<!--:en-->english text<!--:--><!--:de-->german text<!--:-->\' ); ?> xLanguage 两年多没有更新