分别为基本+子项添加重写URL

时间:2016-03-13 作者:Joshua4550

我有一个主页,除此之外还有孩子。我成功地将孩子们改写成这样:

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!简单的话就开枪!

2 个回复
最合适的回答,由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=foohttp://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\' );

SO网友:Milo

这应该适用于这两种情况,对每个正则表达式模式进行轻微调整-

add_rewrite_rule(\'my-url/([^/]+)/?$\', \'index.php?my-var=$matches[1]\', \'top\');
add_rewrite_rule(\'my-url/?$\', \'index.php?my-var=main\', \'top\');

相关推荐