問題描述
我使用自定義帖子類型 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。