自定义分类法和页面重写段冲突给404


9

我正在使用“自定义帖子类型” UI插件来创建我的自定义分类法。我有一个由项目(自定义帖子类型)和2个技术和客户自定义分类法组成的投资组合。客户分类标准具有的自定义重写段portfolio/clients/,而技术分类标准具有的自定义重写段。portfolio/

重写:
portfolio/html <-页面显示使用HTML的所有项目
portfolio/clients/client-a<-页面显示客户端A的所有项目

现在,当我尝试为网址为slug的客户端创建登录页面时,/portfolio/clients我会看到404页面。我很确定这是由于技术分类法的URL重写冲突。我猜是因为它在技术分类法中进行搜索,所以它不存在,然后吐出了404页。那么,如何使url重写插件起作用,以便在我单击时/portfolio/clients,它不会发送回404页面,并且使用正确的页面模板?

Answers:


16

您似乎需要“部分详细重写规则”。详细的重写规则意味着所有页面都放在顶部,因为WordPress无法弄清页面和帖子之间的区别。它认为可以,因为该表单的所有URL portfolio/([^/]+)/都来自您的portfolio分类法,但该URL 除外portfolio/clients/。您将不得不把它放在重写规则之上,以便在更通用的投资组合分类法之前匹配它。您可能还可以强制所有重写规则都变得冗长,但是如果页面很多,那将影响性能。

这个答案是我对重写规则的初步了解而编写的,因此,我希望这是一个很好的方法,并且示例代码中不会包含太多错误。

页面不仅会生成一个重写规则,还会生成一个组:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

您不必自己创建这些,可以重复使用的功能WP_Rewrite。看一下它的page_rewrite_rules()方法:如果我们处于详细模式,它将获取所有页面(通过page_uri_index())及其附件的列表,覆盖%pagename%rewrite标签,并为该页面生成重写规则。我们也可以这样做:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

这将为我们提供页面规则,但尚未为页面中使用的附件提供规则。如果还需要它们,则对每个附件重复此步骤,但要使用add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(请参见page_rewrite_rules()以获取更多详细信息)。

很好,我们有了规则,但是现在您需要以某种方式将它们添加到完整的重写结构中。您可以使用来执行此操作add_rewrite_rule(),但是必须为$page_rewrite_rules数组中生成的每个规则调用它。由于这个原因,很多人都迷上rewrite_rules_array过滤器,因为您可以在那里修改数组。

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

包含此过滤器后,您应该刷新重写规则(一次,每次加载一次,而不是一次,因为它很繁重)。您可以通过调用flush_rewrite_rules(),或访问“固定链接”设置页面来做到这一点。


优秀的!谢谢简!这工作了。我无法得到更好的解释。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.