問題描述

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