問題描述

我一直在梳理這個網站和谷歌的答案,我已經完全空了。基本上我想要做的是什麼 this post 問,但我需要一個分級分類。那個帖子中給出的答案很棒,但是隻有一個級別的分類法。有可能做我想要的嗎?我嘗試了一百萬件事情,但沒有一項工作,最多隻能獲得 404 個固定連結。

為了直觀地說明我想要的:

/basename/ - ideally a page, but I think this will cause a permalink collision
/basename/top-cat/ - top parent custom taxonomy archive
/basename/top-cat/child-cat/ - child cat custom taxonomy archive
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

您可以使用內建的帖子和類別做到這一點,您如何使用自定義分類法和自定義帖子型別進行操作?我知道你需要使用'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), 來獲得分級 s,,這在檔案頁面上工作得很好,但是自定義的帖子型別的帖子會出現 404. 如果我刪除了'hierarchical' => true 部分,那麼這些帖子就會工作,但是我丟失了層次化的 URL / basename / grandchild-cat / post-name / works) 。

那麼,任何解決方案?非常感謝你,現在已經開車了約 3 個星期了。

最佳解決方案

結合了一堆其他答案後,我得到了它的工作!所以這裡也是為那些也在努力的人的解決方案:

 This postthis one 幫助了我一些,所以感謝那些傢伙。

注意,所有這些程式碼,加上您的初始自定義帖子型別和分類註冊程式碼進入您的 functions.php 檔案。

在定義您的自定義帖子型別和分類標準時,首先得到你的 s ies 聲:對於自定義帖子型別,它應該是 basename/%taxonomy_name%,您的分類標準應該只是 basename 。不要忘了還要將'hierarchical' => true 新增到分類法重寫陣列中,以便在您的 URL 中獲取巢狀的術語。還要確保 query_var 在這兩種情況下都設定為 true

您需要新增新的重寫規則,以便 Wordpress 知道如何解釋您的網址結構。在我的情況下,uri 的自定義帖子型別部分將始終是第 5 個 uri 段,因此我相應地定義了我的匹配規則。請注意,如果您使用更多或更少的 uri 段,您可能需要更改。如果你有不同級別的巢狀術語,那麼你需要編寫一個函式來檢查最後一個 uri 段是一個自定義的 post 型別還是一個分類術語來知道要新增哪個規則 (請問我是否需要幫助那) 。

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]';

    return array_merge($newRules, $rules);
}

然後你需要新增這個程式碼讓工作如何處理%taxonomy_name% 在你的自定義 post 型別重寫 slug 結構:

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

我建立了一個基於 Wordpress 自己的 get_category_parents 的自定義功能:

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {
    $chain = '';
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)
        $name = $parent -> slug;
else
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {
        $visited[] = $parent -> parent;
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else
        $chain .= $name . $separator;
    return $chain;
}

然後,您需要重新整理您的永久連結 (只需載入您的永久連結設定頁面) 。

現在全部’should’ 有希望的工作!做一些分類術語並正確巢狀,然後製作一些自定義的帖子型別的帖子並將其正確分類。你也可以用一個 basename 的一個頁面,一切都應該按照我在我的問題中指定的方式工作。您可能需要建立一些自定義分類歸檔頁面來控制它們的外觀,並新增一些 taxonomy widget 外掛,以在側欄中顯示巢狀類別。

希望能幫助你!

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。