URL重写不适用于嵌套页面

时间:2013-10-19 作者:sakibmoon

我正在使用URL重写,如下所示:unexpected problem in url rewrite

它工作没有任何问题,但当我尝试对嵌套页面使用相同的规则时,它不起作用。我有两页page-apage-b. page-a 是的父级page-b. 现在我想捕获传递的变量。URL结构将为:

page-a/page-b/
page-a/page-b/var1/
page-a/page-b/var1/var2/
page-a/page-b/var1/var2/var3/
所以,我制定了三条规则。完整代码如下:

add_filter( \'query_vars\', \'wpse26388_query_vars\' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = \'var1\';
    $query_vars[] = \'var2\';
    $query_vars[] = \'var3\';
    return $query_vars;
}

function wpse26388_rewrites_init(){
     add_rewrite_rule(
        \'page-a/page-b/([0-9]+)/?$\',
        \'index.php?pagename=page-b&var1=$matches[1]\',
        \'top\' );

    add_rewrite_rule(
        \'page-a/page-b/([0-9]+)/([0-9]+)/?$\',
        \'index.php?pagename=page-b&var1=$matches[1]&var2=$matches[2]\',
        \'top\' );

    add_rewrite_rule(
        \'page-a/page-b/([0-9]+)/([0-9]+)/([0-9]+)/?$\',
        \'index.php?pagename=page-b&var1=$matches[1]&var2=$matches[2]&var3=$matches[3]\',
        \'top\' );
}
add_action( \'init\', \'wpse26388_rewrites_init\' );
我正在使用重写分析器,变量得到正确的regex值。现在,当我转到带有如下参数的页面时page-a/page-b/10/20, 参数将自动截断。get_query_var(\'var1\') 什么都得不到。因此,如果我传递1、2或3参数,它将始终重定向到page-a/page-b/.

有人能告诉我我做错了什么吗?

我知道这个正则表达式捕捉数字。但我需要正则表达式,以便以后的任何事情page-a/page-b/ 将由查询变量捕获。我也希望有人能帮我。

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

我在搜索时找到了答案。感谢@Milo的回答:https://wordpress.stackexchange.com/a/50775/23214

pagename 必须包含完整的父/子路径。所以,我不得不改变index.php?pagename=page-b...index.php?pagename=page-a/page-b.... 改变了它,工作正常。

以下是完整代码:

add_filter( \'query_vars\', \'wpse26388_query_vars\' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = \'var1\';
    $query_vars[] = \'var2\';
    $query_vars[] = \'var3\';
    return $query_vars;
}

function wpse26388_rewrites_init(){
     add_rewrite_rule(
        \'page-a/page-b/([0-9]+)/?$\',
        \'index.php?pagename=page-a/page-b&var1=$matches[1]\',
        \'top\' );

    add_rewrite_rule(
        \'page-a/page-b/([0-9]+)/([0-9]+)/?$\',
        \'index.php?pagename=page-a/page-b&var1=$matches[1]&var2=$matches[2]\',
        \'top\' );

    add_rewrite_rule(
        \'page-a/page-b/([0-9]+)/([0-9]+)/([0-9]+)/?$\',
        \'index.php?pagename=page-a/page-b&var1=$matches[1]&var2=$matches[2]&var3=$matches[3]\',
        \'top\' );
}
add_action( \'init\', \'wpse26388_rewrites_init\' );

SO网友:Jordan Lovato

好的,所以在我们开始使用regex(除了数字)之前,让我们快速看看您的所有模式:

add_rewrite_rule(
    \'page-a/page-b/([0-9]+)/?$\',
    \'index.php?pagename=page-b&var1=$matches[1]\',
    \'top\' );
此规则首先添加到列表的顶部。这意味着它将被这3条规则中的最后一条处理。这条规则看起来像是做了你想做的事。

add_rewrite_rule(
    \'page-a/page-b/([0-9]+)/([0-9]+)/?$\',
    \'index.php?pagename=page-bs&var1=$matches[1]&var2=$matches[2]\',
    \'top\' );
此规则是(这三条规则中的)第二条规则。这个规则的模式看起来很棒,然而,它重写的url看起来也有输入错误。改变pagename=page-bspagename=page-b, 除非您的页面名为page-bs 在您的网站上。

add_rewrite_rule(
    \'page-a/page-b([0-9]+)/([0-9]+)/([0-9]+)/?$\',
    \'index.php?pagename=page-b&var1=$matches[1]&var2=$matches[2]&var3=$matches[3]\',
    \'top\' );
最后,首先处理此规则(这3条规则中的一条)。此规则的重写看起来不错,但您的模式似乎有输入错误。改变\'page-a/page-b([0-9]+)/([0-9]+)/([0-9]+)/?$\'\'page-a/page-b/([0-9]+)/([0-9]+)/([0-9]+)/?$\' (您在第b页后错过了一个正斜杠)。

现在,在纠正了这些错误之后,我们应该根据斜杠的数量(在本例中是查询变量)重写到正确的规则。请记住,Regex在拼写错误和确保模式正确时非常挑剔。看起来你的规则顺序也很正确。

现在,如果我们想匹配除数字以外的任何东西,我们需要在正则表达式模式中指定这一点。通常,在重写URL时,我们希望匹配数字、小写字母、大写字母和连字符。为此,我们需要更改([0-9]+)([0-9a-zA-Z-]+).

下面是一个示例URL及其对应的模式:URL:www.example。com/page-a/page-b/my-cool-new-slug-12/my-cool-new-subslug-11/重写规则:

add_rewrite_rule(
    \'page-a/page-b/([0-9a-zA-Z-]+)/([0-9a-zA-Z-]+)/?$\',
    \'index.php?pagename=page-b&var1=$matches[1]&var2=$matches[2]\',
    \'top\' );
应为重写的URL:www.example。com/索引。php?pagename=第b页(&;var1=my-cool-new-slug-12和;var2=my-cool-new-subslug-11

希望有帮助!

如果你有任何问题,请告诉我。

结束

相关推荐