我目前正在开发一个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
答案 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'];
我希望这对某人有所帮助: - )