Wordpress:在 url 中包含语言变量

Posted

技术标签:

【中文标题】Wordpress:在 url 中包含语言变量【英文标题】:Wordpress: include language variable in url 【发布时间】:2015-09-23 13:59:03 【问题描述】:

我一直在为 wordpress 开发一个可以完全运行的语言插件。现在唯一缺少的是 url 重写。我一直在查看有关 *** 的很多网站、资源和其他问题,但我似乎无法让我的永久链接正常工作。

我已经能够像这样添加一个查询字符串变量:

public function append_query_string($url) 

    $args = array('lang' => $this->get_locale());
    return add_query_arg($args, $url);

add_filter('page_link', array($this, 'append_query_string'));
add_filter('post_link', array($this, 'append_query_string'));
add_filter('the_permalink', array($this, 'append_query_string'));

例如,这会将我的链接更改为http://www.mylink.com?lang=en_us。我现在想要的是添加一个永久结构,以便用户可以拥有漂亮的网址(例如http://www.mylink.com/en/

我添加了以下代码:

public function add_query_var($vars)

    $vars['lang'] = $this->get_locale();
    return $vars;

add_filter('request' , array($this, 'add_query_var'), 10, 2 );

public function custom_permastruct() 

    add_permastruct('language', '%lang%', false);

add_action('wp_loaded', array($this, 'custom_permastruct'));

我想我现在唯一需要的是重写规则,但我可能完全错了。谁知道添加此永久结构的最佳解决方案是什么?

编辑 我一直试图让这个工作一个月,我似乎无法掌握永久链接,即使之前的所有答案和我自己的研究也是如此。所以这就是为什么我再次用赏金来挑战这篇文章。我需要什么:我有一个返回语言代码的函数 (get_locale)。这个语言代码应该在我的url中实现如下:"http://www.mywebsite.com/LANGUAGE_HERE/..."

我知道我需要为此注册自己的永久链接结构,但这就是一切出错的地方。我需要什么过滤器,我应该在过滤器函数中添加什么?非常感谢任何帮助,因为我在这里变得非常绝望。

编辑 2

所以我添加了重写规则,但它们似乎也不起作用。我在这里有点绝望。无论如何,这是重写规则的代码:

public function add_rewrite_rules()
   
    $languages = $this->get_all_languages();
    foreach($languages as $language) 
        add_rewrite_rule('^' . $language->code . '/([^/]*)/?$', 'index.php?lang=$matches[1]', 'top');
    

add_action('init', array($this, 'add_rewrite_rules'));

【问题讨论】:

【参考方案1】:

正确设置的 Wordpress 2.0+ 会将所有请求重定向到 /index.php,因此它不需要任何 htaccess 更新,并且您注册的 perma-struct 看起来不错。我认为剩下的就是 configuring wordpress to use your %lang struct 使用自定义结构,你应该很高兴

【讨论】:

【参考方案2】:

试试下面的代码

function custom_rewrite_rules()
  global $langs; 
   //Array containing locale => pretty permalink key value pair
   /*
    $langs = array (
             'en_us' => 'en',
            )
   */

  foreach($langs as $locale => $lang) 
  add_rewrite_rule(
                   '^'.$lang.'/\/(.*)/?$',
                   'index.php?lang='.$locale,
                   'top'
                   );
  


add_action( 'init', 'custom_rewrite_rules' );

【讨论】:

这还不完整,但您会得到有关如何继续的提示。【参考方案3】:

我也遇到了永久链接结构的问题。有时单击所需的永久链接,然后再次保存可以解决问题。由于 WordPress 在保存时会重写 htaccess

【讨论】:

当您从管理后台访问永久链接页面时,它实际上会执行永久链接刷新。【参考方案4】:

好吧好吧,这里有一段代码可以实现你的要求。

public function init()

    $permalink_structure = get_option( 'permalink_structure' );

    if( $permalink_structure != '' )

        global $wp_rewrite;

        $lang = '/' . get_locale();

        if ( ! got_url_rewrite() )
            $prefix = '/index.php';

        if ( is_multisite() && !is_subdomain_install() && is_main_site() )
            $blog_prefix = '/blog';


        if ( ! empty( $permalink_structure ) ) 

            $permalink_structure = preg_replace( 
                '#/+#',
                '/',
                '/' . str_replace( '#', '', $permalink_structure )
            );

            if ( $prefix && $blog_prefix )
                $permalink_structure = $prefix . preg_replace( 
                    '#^/?index\.php#',
                    '',
                    $permalink_structure
                );
            else
                $permalink_structure = $blog_prefix . $permalink_structure;
        


        if( substr( $permalink_structure, 0, strlen($lang) ) !== $lang )
            $permalink_structure = $lang . $permalink_structure;
        

        $wp_rewrite->set_permalink_structure( $permalink_structure );

              

注意事项:

1) 确保您在 init 钩子中使用了 init(您可以为函数指定任何名称)函数。

2) 在wp-admin 文件夹中查找options-permalink.php。从75 行开始,您将看到一些有趣的代码,这些代码构成了此答案的基础。

3) 您可能还想阅读法典上的 article

上述代码不需要用户手动选择永久链接结构。任何使用的永久链接结构都将在前面加上locale

【讨论】:

今晚我要检查一下! ;) 这段代码似乎不起作用,因为每次我更改语言时,我的永久链接只是将当前语言添加到其结构中(如下所示:/nl_NL/pl_PL/en_US/%postname %) 嗯,您可以做的是检查预定义的语言环境列表,如果 $permalink_structure 中存在该语言环境,则将其删除并添加新的语言环境。那将是纯PHP。第二个选项,因为您正在处理 WordPress,将在数据库中存储一个选项,该选项将保存先前设置的语言环境。每次更改语言时,插件都会检查 $permalink_structure 中是否存在旧语言环境。如果是,则将其删除。如果您选择第二个选项,那么您的代码应放在 $permalink_structure = $lang . $permalink_structure 之前

以上是关于Wordpress:在 url 中包含语言变量的主要内容,如果未能解决你的问题,请参考以下文章

PHP URL中包含中文,查看时提示404

Composer:在包 URL 中包含版本变量

Typeahead.js 在远程 url 中包含动态变量

在 YAML 变量中包含 jekyll / 液体模板数据?

WordPress 是不是在管理页面中包含 jQuery?

如何在 WordPress 主题中包含 jQuery?