Wordpress重写API,add_rewrite_rule问题

时间:2016-05-05 18:33:23

标签: php wordpress wordpress-plugin

我在本地机器上安装了wordpress: 所以我的home_url是http://localhost/wordpress(没有创建任何虚拟主机条目)

我创建了一个名为test的页面,其中page_id = 19.现在我需要使用重写如下:

当有http://localhost/wordpress/group/abc的任何请求时, 它应该转换为http://localhost/wordpress/?page_id=19&group=abc

我的.htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /wordpress/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wordpress/index.php [L]
</IfModule>

#END WordPress

我尝试了什么:

 add_action('init', function() {
     global $wp_rewrite; 
     $wp_rewrite->flush_rules();
     add_rewrite_rule('^group/([^/]+)', 'index.php?page_id=19&group=abc', 'top');
    add_rewrite_tag('%group%', '[A-Za-z]+');
 });

但是每当我尝试访问http://localhost/wordpress/group/abc时,我都会收到404错误。

请建议,我做错了。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

经过多次重新审视后发现:

  • 使用pagename而不是page_id始终是安全的。
  • 应使用自定义查询变量(此处为组)注册。
  • 还有一个名为rewrite_rules_array
  • 的过滤器

所以上面的代码可能看起来像(添加的页面名称是test):

add_filter( 'query_vars', function($query_vars) {
   $query_vars[] = 'group';
   return $query_vars;
});

add_action('init', function() {
    global $wp_rewrite; 
    $wp_rewrite->flush_rules();
    add_rewrite_rule('group/(.*)', 'index.php?pagename=test&group=$matches[1]', 'top');
});

但我们无法通过$_GET['group']访问群组价值。我们需要通过get_query_var('group')

访问它

添加重写规则的另一种方法:

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {   
    $newrules = array();
    $newrules[ 'group/(.*)/?$' ] = 'index.php?pagename=test&group=$matches[1]';
    return $newrules + $rules;
}