在 WordPress 從 menu 取得某一主類別下階所有的子類別

常見做法有兩種

  • 先從 WordPress 選單(menu)找到某個主選單項目
  • 再取得這個選單項目所對應分類底下的所有子分類

menu 項目連到「文章分類 category」

作法一:先從 menu 找到主類別,再抓所有下層子類別

PHP
<?php
$menu_name = 'main-menu'; // 選單名稱或 slug
$target_menu_title = '產品分類'; // 你要找的主選單名稱

$menu_items = wp_get_nav_menu_items($menu_name);

$target_category_id = 0;

if ($menu_items) {
    foreach ($menu_items as $item) {
        // 找到指定的主選單
        if ($item->title === $target_menu_title && $item->object === 'category') {
            $target_category_id = (int) $item->object_id;
            break;
        }
    }
}

if ($target_category_id) {
    // 取得所有子分類(包含孫分類)
    $child_categories = get_terms([
        'taxonomy'   => 'category',
        'hide_empty' => false,
        'child_of'   => $target_category_id,
    ]);

    echo '<pre>';
    print_r($child_categories);
    echo '</pre>';
}
?>

如果只要「直屬子分類」,不要孫分類

child_of 改成 parent

PHP
<?php
$child_categories = get_terms([
    'taxonomy'   => 'category',
    'hide_empty' => false,
    'parent'     => $target_category_id,
]);
?>

如果你是已知主類別 ID,直接抓子類別

其實不一定要先經過 menu,直接這樣最乾脆:

PHP
<?php
$parent_cat_id = 12; // 主類別ID

$child_categories = get_terms([
    'taxonomy'   => 'category',
    'hide_empty' => false,
    'child_of'   => $parent_cat_id, // 取得全部下階
]);

foreach ($child_categories as $cat) {
    echo $cat->term_id . ' - ' . $cat->name . '<br>';
}
?>

從 menu 結構找「某主選單底下的子選單」,再取出對應分類

這是另一種意思:不是找「分類的子分類」,而是找「menu 某主選單底下的子 menu 項目」。

PHP
<?php
$menu_name = 'main-menu';
$target_menu_title = '產品分類';

$menu_items = wp_get_nav_menu_items($menu_name);

$parent_menu_id = 0;
$child_menu_categories = [];

if ($menu_items) {
    foreach ($menu_items as $item) {
        if ($item->title === $target_menu_title) {
            $parent_menu_id = $item->ID;
            break;
        }
    }

    if ($parent_menu_id) {
        foreach ($menu_items as $item) {
            if ((int) $item->menu_item_parent === $parent_menu_id && $item->object === 'category') {
                $child_menu_categories[] = get_term((int) $item->object_id, 'category');
            }
        }
    }
}

echo '<pre>';
print_r($child_menu_categories);
echo '</pre>';
?>

差異整理

A. 取得「某主類別」底下真正的分類樹

get_terms()

  • child_of = 取得全部下層
  • parent = 只取直屬子類別

B. 取得「某 menu 主項目」底下的子 menu

wp_get_nav_menu_items() 搭配:

  • menu_item_parent
  • object === 'category'

發佈留言

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


內容索引