重写CPT子页面URL以支持查询变量

时间:2016-03-29 作者:Esaevian

我对重写规则有一些问题。我有这样一个URL:

http://www.domain.com/post-type/parent-page/child-page/section-id

我想通过查询变量来处理

http://www.domain.com/post-type/parent-page/child-page?section=section-id

我有这个标签和规则集:

add_action(\'init\', \'custom_rewrite_tag\', 10, 0);
function custom_rewrite_tag() {
    add_rewrite_tag(\'%section%\', \'([^(&)]+)\');
}

add_action(\'init\', \'custom_rewrite_rule\', 10, 0);
function custom_rewrite_rule() {
    add_rewrite_rule(\'post-type/(.+?)/(.+?)/(.+?)/?$\', \'index.php?pagename=$matches[1]/$matches[2]&section=$matches[3]\',\'top\');
} 
然而,页面正在404和输出$wp->matched_query 显示它没有选择我的规则,而是进一步选择规则列表(由WP自动创建)。它实际上与$wp_rewrite->wp_rewrite_rules() 以开头的数组post-type.

奇怪的是,如果我将规则更改为:

add_rewrite_rule(\'post-type/(.+?)/(.+?)/(.+?)/?$\', \'index.php?p=1234567&extravar=$matches[1]/$matches[2]&section=$matches[3]\',\'top\');
(即,通过转到一个不存在的ID,有目的地404页面,并只是传递变量以供参考)$wp->matched_query 显示我的正则表达式,url与它应该的一样(index.php?p=1234567&extravar=parent-page/child-page&section=section-id)

我的重定向URL导致重写引擎跳过我的规则的原因是什么?有什么事吗pagename?

Edit: 其他测试表明http://www.domain.com/post-type/?pagename=parent-page/child-page&section=section-id 作品所以pagename 显然是有效的。

Edit 2: 更多测试,更改add_rewrite_rule 调用以检查帖子类型。。。无骰子:

add_rewrite_rule(\'post-type/(.+?)/(.+?)/(.+?)/?$\', \'index.php?post_type=post-type&pagename=$matches[1]/$matches[2]&section=$matches[3]\',\'top\');
我也尝试过使用$matches[2], 仍不工作:

add_rewrite_rule(\'post-type/(.+?)/(.+?)/(.+?)/?$\', \'index.php?post_type=post-type&pagename=$matches[2]&section=$matches[3]\',\'top\');
奇怪的是,手动构建这些URL(如填充查询字符串值)实际上加载了正确的页面。不知道重写API会有什么不同。

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

好吧,在玩了很多之后,我发现:

它匹配的正则表达式(跳过我的规则时)是practice-area/(.+?)(?:/([0-9]+))?/?$<这有一个$matches 2个阵列:parent-page/child-page 和anumber 接下来是空白,因为我试图构建的URL中没有一个index.php?post-type=$matches[1]&page=$matches[2]. 我没意识到post-type 可以是查询变量键。这就是我最终走上正确道路的原因post-type/(.+?)(?:/(.+))?/?$$matches[1] = parent-page 和$matches[2] = child-page/section-idpost-type/(.+)/(.+?)/?$, 它成功地取代了上文(1)中的正则表达式

  • $matches[1] = parent-page/child-age$matches[2] = section-id

    add_rewrite_rule(\'post-type/(.+)/(.+?)/?$\', \'index.php?post-type=$matches[1]&section=$matches[2]\',\'top\');
    

相关推荐