WordPress add_rewrite_rule返回404的字符串

时间:2017-09-22 18:29:36

标签: php wordpress apache .htaccess mod-rewrite

我目前正在开发一个WordPress项目,而且我对.htaccess重写规则有点不了解。

我的WordPress重写规则代码如下:

if (!function_exists('check_string_id_rule')){
function check_string_id_rule(){
    add_rewrite_rule('id-check/([^/]+)','id-check/?id=$1','top');
}
add_action('init', 'check_string_id_rule');

免责声明:根据文档,我应该使用$ matches [1]而不是$ 1。我试过了,但是,它只会将id的值设置为"匹配[1]"。 $ 1似乎在某种程度上可以解决这个问题。

当我导航到 mywebsite.com/id-check/12 时,一切正常,我的ID值为12.

然而,我的ID是由多个字符构成的,这些字符包含来自a-z的字母,0-9的数字以及偶尔的连字符' - '。

如果我导航到 mywebsite.com/id-check/12a-5 ,我会被重定向到空白页面。 WordPress似乎将我重定向到一个不存在的页面。它试图将我重定向到/ 12a-5页面。转到 mywebsite.com/id-check/?id=12-a5 按预期工作。

为什么我的规则没有被执行?我检查了.htaccess文件,似乎没有任何竞争规则。

 <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^id-check/([^/]+) /id-check/?id=$1 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

这是一些WordPress的怪癖,还是我在这里遗漏了什么?

提前谢谢你,

Stijn van der Pol

1 个答案:

答案 0 :(得分:1)

我设法解决了自己的问题。看来我的问题出现在我的add_rewrite_rule逻辑的第二个参数中。

我部分遵循了以下文章:http://www.rlmseo.com/blog/passing-get-query-string-parameters-in-wordpress-url/

我知道超链接是不受欢迎的,但是归功于rlmseo.com。简而言之,他们提出了一种注册重写规则的不同方法。通过我自己的一些更改,它会导致以下代码..

在我的functions.php中:

if(!function_exists('add_rewrite_rules')){
    function add_rewrite_rules($aRules) {
        $aNewRules = ['id-check/([^/]+)' => 'index.php?pagename=id-check&id=$matches[1]'];
        $aRules = $aNewRules + $aRules;
        return $aRules;
    }
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

然后我在functions.php中使用以下标签重写逻辑:

function id_rewrite_tag() {
    add_rewrite_tag('%id%', '([^/]+)');
}
add_action('init', 'id_rewrite_tag');

然后在我看来,我使用:

访问变量
global $wp_query;
$id = $wp_query->query_vars['id'];

我希望这对某人有所帮助: - )