[WordPress] 取得文章全部分類階層列表的方法

本篇文章更新時間:2021/03/27
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣贊助支持。


WordPress 分類或標籤的設計都是使用 Taxonomies 架構。從屬關係可以很多元,像是一篇文章可以有多個分類與標籤,而分類還可以有階層關係(上層分類或子分類的概念)。

由於資料都是個別把關係(Data Relationships)記錄在資料表裡,並不是一個完整的從屬結構資料,所以想找出完整的分類階層結構列表會有難度。

如果是從最末端的方式去找不難,像是從一篇文章去找到有哪些所屬分類,分類又有哪些上層分類等,但如果以全站角度來看分類結構的時候,下推回去就沒有這類型方法了(我沒找到XD

下面寫了一個遞迴查找的方法來遍歷一次所有分類節點並記錄在陣列裡,藉此取得整個分類關係網絡階層。

function set_hierarchical($cats, &$hierarchical_cats) {
    foreach ($cats as $key => $cat) {
        if (!isset($hierarchical_cats[$cat->name . '_' . $cat->term_id])) {
            $hierarchical_cats[$cat->name . '_' . $cat->term_id] = array();
        }
        $args = array(
            'hide_empty'   => false,
            'orderby'      => 'parent',
            'hierarchical' => true,
            'child_of'     => $cat->term_id,
        );
        $sub_cats = get_categories($args);
        set_hierarchical($sub_cats, $hierarchical_cats[$cat->name . '_' . $cat->term_id]);
    }
    return $hierarchical_cats;
}
$args = array(
    'hide_empty'   => false,
    'orderby'      => 'parent',
    'hierarchical' => true,
    'parent'       => 0,
);
$cats              = get_categories($args);
$hierarchical_cats = array();
$hc                = set_hierarchical($cats, $hierarchical_cats);
foreach ($hc as $lv1 => $value) {
    if (count($value) != 0) {
        foreach ($value as $lv2 => $value2) {
            if (count($value2) != 0) {
                foreach ($value2 as $lv3 => $value3) {
                    echo $lv1 . ' -> ' . $lv2 . ' -> ' . $lv3 . PHP_EOL;
                }
            } else {
                echo $lv1 . ' -> ' . $lv2 . PHP_EOL;
            }
        }
    } else {
        echo $lv1 . PHP_EOL;
    }
}

原理就是用取得分類的方法 get_categories 先把最上層分類找到,帶參數給 set_hierarchical 方法紀錄後再往下層繼續找。

最下方列印方法算是寫死的部分,僅針對 3 層結構輸出,如果有第 4 層的就沒能印出來了!但原本查找回來的陣列還是完整的沒錯,就是看取得回來的資料要怎樣運用了,這邊只有寫一個概念,沒有一個所謂的「官方」或「固定」的格式。有需求就可以參考修改來斟酌使用囉~


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____34%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *