问题描述

我使用自定义帖子类型 UI 插件创建我的自定义分类。我有一个由项目 (自定义帖子类型) 组成的投资组合,具有两种技术和客户的定制分类。客户分类有 portfolio/clients/的自定义重写段,而技术分类有 portfolio/的自定义重写段

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

现在,当我尝试为具有/portfolio/clients 的网址的客户端制作一个着陆页时,我得到了 404 页面。我很确定这是因为技术分类法的 URL 重写冲突。我猜测它在技术分类中搜索它,但它不存在,然后它吐出 404 页面。那么如何让 url 重写 slug 工作,所以当我打/portfolio/clients,它不发回 404 页面,它使用正确的页面模板?

最佳解决方案

你似乎需要 「部分详细的重写规则」 。详细的重写规则意味着所有页面都放在顶部,因为 WordPress 无法弄清页面和帖子之间的差异。在这里它认为它可以,因为 portfolio/([^/]+)/形式的所有 URL 来自您的 portfolio 分类,除了这一个 portfolio/clients/。您将必须将其放在重写规则之上,因此它在更通用的组合分类之前匹配。你也可能强制所有的重写规则是冗长的,但是如果你有很多页面,那么会影响性能。

这个答案是用我的 just-gained 理解的重写规则写的,所以我希望这是一个很好的方法,而且示例代码不包含太多的错误。

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

  • (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]+)?/?$

你不必自己创建这些,你可以将 re-use 的功能 WP_Rewrite 。查看它的 page_rewrite_rules() 方法:如果我们处于详细模式,它将获取所有页面 (via page_uri_index()) 及其附件的列表,覆盖%pagename%重写标记,并生成此页面的重写规则。我们也可以这样做:

// 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()或访问”Permalinks” 设置页面来执行此操作。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。