Wordpress:在网址

时间:2015-07-06 12:13:32

标签: wordpress url-rewriting permalinks

我一直在为wordpress开发一个完全有效的语言插件。现在唯一缺少的是网址重写。我一直在关注stackoverflow上的很多网站,来源和其他问题,但我似乎无法让我的永久链接工作。

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

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。我现在想要的是添加一个permastruct,以便用户可以拥有漂亮的网址(例如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'));

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

修改 我一直试图让这个工作一个月,我似乎无法掌握永久链接,甚至没有以前所有的答案和我自己的研究。这就是为什么我再次以赏金来发布这篇文章的原因。我需要的是:我有一个返回语言代码的函数(get_locale)。此语言代码应在我的网址中实现,如下所示:"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'));

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

尝试以下代码

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' );

答案 2 :(得分:3)

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

答案 3 :(得分:1)

很好,这是一段代码,可以实现您的要求。

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)您可能还想在codex上阅读此article

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