您似乎需要“部分详细重写规则”。详细的重写规则意味着所有页面都放在顶部,因为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()
,或访问“固定链接”设置页面来做到这一点。