You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取WordPress父菜单(ID:95)子项的ACF字段?

遍历指定父菜单的子项并获取ACF字段的实现方法

没问题,我来帮你搞定这个需求!要在WordPress里遍历ID为95的父菜单项下的所有子项,同时获取每个子项的ACF字段,你可以按照下面的步骤操作:

1. 获取目标导航菜单的所有菜单项

首先你需要获取到对应的导航菜单数据,这里有两种常见方式:

  • 如果你知道菜单的slug(比如你的菜单叫"主菜单",slug可能是main-menu),直接用wp_get_nav_menu_items传入slug即可;
  • 如果你不确定slug,可以通过主题注册的菜单位置来获取菜单ID,比如你的主题把主菜单注册在primary位置:
    $menu_locations = get_nav_menu_locations();
    $target_menu_id = $menu_locations['primary']; // 替换成你的菜单位置
    $all_menu_items = wp_get_nav_menu_items($target_menu_id);
    

2. 筛选出父ID为95的子菜单项

拿到所有菜单项后,用array_filter筛选出menu_item_parent等于95的子项:

if ($all_menu_items) {
    $child_menu_items = array_filter($all_menu_items, function($item) {
        return $item->menu_item_parent == 95;
    });
}

3. 遍历子项并获取ACF字段

ACF存储导航菜单项的字段时,对应的post类型是nav_menu_item,所以获取字段时需要指定完整的post标识:nav_menu_item_{菜单项ID}。

下面是完整的示例代码,包含不同类型ACF字段的处理方式:

// 替换成你的菜单slug或通过位置获取的菜单ID
$menu_items = wp_get_nav_menu_items('main-menu');

if ($menu_items) {
    // 筛选父ID为95的子项
    $child_items = array_filter($menu_items, function($item) {
        return $item->menu_item_parent == 95;
    });

    // 遍历每个子菜单项
    foreach ($child_items as $item) {
        // 输出菜单项的基础信息(标题、链接)
        echo '<div class="menu-child-item">';
        echo '<a href="' . esc_url($item->url) . '">' . esc_html($item->title) . '</a>';

        // --- 处理文本类ACF字段 ---
        // 替换成你的字段名,比如"menu_item_description"
        $custom_desc = get_field('menu_item_description', 'nav_menu_item_' . $item->ID);
        if ($custom_desc) {
            echo '<p class="item-desc">' . esc_html($custom_desc) . '</p>';
        }

        // --- 处理图片类ACF字段 ---
        // 替换成你的图片字段名,比如"menu_item_icon"
        $custom_icon = get_field('menu_item_icon', 'nav_menu_item_' . $item->ID);
        if ($custom_icon) {
            echo '<img src="' . esc_url($custom_icon['url']) . '" alt="' . esc_attr($custom_icon['alt']) . '" class="item-icon">';
        }

        // --- 处理其他类型字段(比如选择框、 repeater等)---
        // 选择框字段直接用get_field获取即可,repeater字段需要循环遍历:
        $repeater_items = get_field('menu_repeater_field', 'nav_menu_item_' . $item->ID);
        if ($repeater_items) {
            echo '<ul class="repeater-list">';
            foreach ($repeater_items as $repeater_item) {
                echo '<li>' . esc_html($repeater_item['repeater_sub_field']) . '</li>';
            }
            echo '</ul>';
        }

        echo '</div>';
    }
}

注意事项

  • 确保你的ACF字段已经设置了正确的位置规则:在ACF字段组的位置设置中,选择"导航菜单项",这样字段才会关联到导航菜单项上;
  • 所有输出内容记得用esc_url、esc_html、esc_attr等函数做转义,避免XSS安全问题;
  • 如果菜单不存在或者没有子项,代码会自动跳过循环,不会报错。

内容的提问来源于stack exchange,提问作者Bayron2304

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:28:14