Custom rewrite rule ignored

时间:2016-09-24 作者:Robbert

What I need

为了进行产品页面变化测试,我正在尝试将我的产品页面url重写为如下内容:

www.website.com/products/product-x/variation/1/

What I have done

我添加了查询变量,如下所示:

/**
 * Adds variation query var
 */
function gtp_add_variation_query_vars( $vars ) {
   $vars[] = \'variation\';
   return $vars;
}
add_filter( \'query_vars\', \'gtp_add_variation_query_vars\');
我已经迷上了generate_rewrite_rules, 要添加新的重写规则,请执行以下操作:

/**
 * Adds rewrite rule for template variation paramater
 */
function gtp_add_variation_rewrite_rules() {

   global $wp_rewrite;

   // Rewrite rule with (v)ariation parameter
   $new_rules[\'products/(.+?)/variation/([0-9]*)/?$\'] = \'index.php?post_type=products&products=\' . $wp_rewrite->preg_index( 1 ) . \'&variation=\' . $wp_rewrite->preg_index( 2 );

   // Add new rewrite rules to rewrite rules array
   $wp_rewrite->rules = $wp_rewrite->rules + $new_rules;

   return $wp_rewrite->rules;

}
add_action( \'generate_rewrite_rules\', \'gtp_add_variation_rewrite_rules\' );
刷新重写规则时,在$wp_rewrite->rules 已添加阵列:

[products/(.+?)/variation/([0-9]*)/?$] => index.php?post_type=products&products=$matches[1]&variation=$matches[2]

The problem

但当我访问该页面时:www.website.com/products/product-x/variation/1/ 我有一个404。

奇怪的是,它可以在我的XAMPP本地主机副本上运行,但不能在实时站点上运行。这可能是与服务器相关的问题吗?或者另一个重写规则(但我认为这应该不是问题,因为该规则位于重写规则数组的底部)

Extra information:

我已将永久链接结构(在设置->永久链接下)设置为自定义结构"/%category%/%postname%/".

我的htaccess文件如下所示:

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

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

重写规则是正确的,但因为您正在修改$wp_rewrite 直接来说,您无法使用将规则添加到堆栈顶部add_rewrite_rules.

规则在数组中的位置正确,但首先检查顶部的规则,然后使用第一个要匹配的规则。

用下面的代码替换这两个函数应该可以处理query\\u var和重写规则+定位。

/**
 * Adds rewrite rule for template variation paramater
 */
function gtp_add_variation_rewrite_rules() {
    add_rewrite_tag( \'%variation%\', \'([0-9]*)\' );
    add_rewrite_rule( \'products/(.+?)/variation/([0-9]*)/?$\', \'index.php?post_type=products&products=$matches[1]&variation=$matches[2]\', \'top\' );
}

add_action( \'init\', \'gtp_add_variation_rewrite_rules\' );

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?