我有一个主页,除此之外还有孩子。我成功地将孩子们改写成这样:
add_rewrite_rule(\'my-url/?([^/]*)\', \'index.php?my-var=$matches[1]\', \'top\');
这很有效。但当我试图重写基础时:
add_rewrite_rule(\'my-url/?\', \'index.php?my-var=main\', \'top\');
。。。它不起作用。我知道,它被第一条规则改写了,所以我把它们调换了,但后来孩子们都被重定向到主页。
有没有办法使第二条规则变得严格,以便只有在“我的url/”之后没有任何内容时才有效?这样我就可以先移动它,一切都应该正常。
我在网上搜索了一下,没有找到解决办法。也许这是我的条件,但我在这件事上伤了自己。我讨厌regex!简单的话就开枪!
最合适的回答,由SO网友:iantsch 整理而成
将重写规则和顺序更改为以下内容:
add_rewrite_rule(\'my-url/([^/]*)/?$\', \'index.php?my-var=$matches[1]\', \'top\');
add_rewrite_rule(\'my-url/?$\', \'index.php?my-var=main\', \'top\');
Why the order?如果顺序相反,第一条规则将始终适用,因此规则集永远不会到达您的主页
Why the changed syntax?允许正确处理其他查询字符串。E、 g。http://foo.bar/my-url/?my-var=foo 和http://foo.bar/my-url/foo/?bar=1 应提取到。
Additionally: 模板重定向,如果要将重写规则应用于查询字符串请求,如http://foo.bar/my-url/?my-var=foo:
function custom_template_redirect(){
preg_match(\'/(\\?|&)my-var=/\', $_SERVER[\'REQUEST_URI\'], $matches);
if (
get_query_var( \'my-var\', false ) !== false &&
!empty($matches) &&
!is_admin()
) {
wp_redirect(
home_url(
\'/my-url/\'.(get_query_var( \'my-var\' )?get_query_var( \'my-var\' ).\'/\':\'\')
)
);
exit();
}
}
add_action( \'template_redirect\', \'custom_template_redirect\' );