了解添加重写规则

时间:2016-12-30 作者:Louis W

我正在努力add_rewrite_rule 正在从url提取参数并将其传递给请求。看到了许多关于这方面的帖子,但似乎无法使其发挥作用。

如果url以某个字符串开头,我想将其从url中删除,并将其作为查询参数传递。

请求url示例:

http://domain.com/foo/my_page
这将转变为

http://domain.com/my_page?param=foo
如果“foo”不存在,它应该作为一个普通请求通过。此逻辑应适用于我的网站上的任何页面url或自定义帖子类型url(基本上是foo/*)。如果url中有“foo”将其去掉,然后将其传递给Wordpress,则认为这将充当传递,这是正常的。

我已将“param”作为允许的query\\u vars输入。

总的来说,它需要为以下方面工作:

foo/my\\u页面(第页)/foo/my\\u文件夹/my\\u页面(子页)/foo/example\\u类型(自定义贴子存档)/foo/example\\u类型/example\\u贴子(自定义贴子单)

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

好的,我已经得到了所有3种类型请求的工作示例。为了让它们工作起来,需要大量的实验和胡闹。我想米洛很擅长说服人们回答他们自己的问题。

在无数次更改和刷新永久链接后,我意识到在add\\u rewrite\\u url之外找出url要容易得多,一旦它们工作了,就可以定义重写。示例为index.php?param=foo&post_type=example_type.

另一件显而易见的事情是,在这里添加它,这样可能会帮助其他人。在定义页面/子页面通配符规则之前,必须定义自定义帖子类型add\\U rewrite\\U规则规则。我在这件事上浪费了不少时间,认为这是导致我不理解规则为什么不起作用的主要原因。

以下是适用于我所有需求的3条规则。页面/子页面规则被合并为一个规则。

// Custom Post Archive
add_rewrite_rule(
    \'^foo/example_type/?$\',
    \'index.php?param=foo&post_type=example_type\',
    \'top\'
    );

// Custom Post Individual
add_rewrite_rule(
    \'^foo/example_type/([^/]*)/?$\',
    \'index.php?param=foo&example_type=$matches[1]\',
    \'top\'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    \'^foo/(.+)/?$\',    
    \'index.php?param=foo&pagename=$matches[1]\',
    \'top\'
    );
此外,我所做的是设置一个循环来添加多个自定义帖子类型规则。请记住,在定义页面/子页面通配符规则之前,必须先定义自定义帖子类型add\\U rewrite\\U规则规则。

$custom_types = array(\'example_type\', \'projects\', \'people\');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        \'^foo/\'.$type.\'/?$\',
        \'index.php?param=foo&post_type=\'.$type,
        \'top\'
        );

    // Custom Post Individual
    add_rewrite_rule(
        \'^foo/\'.$type.\'/([^/]*)/?$\',
        \'index.php?param=foo&\'.$type.\'=$matches[1]\',
        \'top\'
        );

}
TheRewrite Analyzer 当Milo试图更好地理解Wordpress如何查询页面/帖子时,他传递的信息非常有用。

SO网友:Milo

一条适用于您的示例的基本规则:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        \'^foo/([^/]*)/?\',
        \'index.php?pagename=$matches[1]&param=foo\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_foo_rewrite_rule\' );
这需要后面的一切foo/ 并将其设置为pagename 用于查询,然后param 获取静态值foo. 如果需要不同的URL模式,则需要为每个唯一的模式制定额外的规则。提到WP_Query docs 对于可以在重写规则中设置的各种查询变量。添加新规则后,不要忘记刷新重写规则。这可以通过访问Permalinks设置页面来完成。

现在访问示例URL:

http://domain.com/foo/my_page
将加载正确的页面,但其行为与访问不同:

http://domain.com/my_page?param=foo
因为在使用内部重写时,param 设置在$wp_query 查询对象,而不是$_GET 超全局。如果您需要使用在中查找值的代码$_GET, 您需要额外的步骤来设置该值:

function wpd_foo_get_param() {
    if( false !== get_query_var( \'param\' ) ){
        $_GET[\'param\'] = get_query_var( \'param\' );
    }
}
add_action( \'parse_query\', \'wpd_foo_get_param\' );
另一种要考虑的方法是使用端点,所以/foo/ 将位于URL的末尾,而不是作为前缀。这样做的好处是APIadd_rewrite_endpoint 简化添加所需的所有规则,包括启用分页。

相关推荐