如何获取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
相关产品推荐
相关产品推荐

