如何为WordPress移动端自定义菜单循环?代码无返回求助
Polylang多语言站点移动端自定义菜单无内容排查与修复
核心问题分析
你的代码无返回,大概率是多语言环境下菜单匹配失败或代码存在潜在逻辑问题:
- 多语言菜单名称不匹配:Polylang下不同语言的菜单通常会使用对应语言的名称(比如中文叫「移动端菜单」,英文叫「Mobile Menu」),直接硬编码英文名称会导致非英文语言环境下找不到对应菜单。
- 函数定义位置不合理:原代码中
count_menu_items_by_parent函数定义在if ($menu_items)分支内,若菜单为空,函数未定义可能引发隐性错误。 - 缺少语言过滤:Polylang不会自动为
wp_get_nav_menu_items过滤当前语言的菜单,需手动关联语言属性。
排查步骤
- 确认每个语言版本都创建了对应移动端菜单,并在Polylang后台为菜单分配了正确的语言属性。
- 建议改用菜单ID调用(菜单ID在WordPress后台「外观-菜单」编辑页的URL中可查看),ID是唯一且不随语言变化的,比名称更可靠。
- 开启WordPress调试模式(在
wp-config.php中设置define('WP_DEBUG', true);),查看是否有菜单不存在、函数未定义等警告信息。
修复后的代码
<?php // 提前定义函数,避免未定义警告 function count_menu_items_by_parent($parent_ID, $menu_items) { $count = 0; foreach ($menu_items as $menu_item) { if ($menu_item->menu_item_parent == $parent_ID) { $count++; } } return $count; } // 获取当前语言(Polylang内置函数) $current_lang = pll_current_language(); // 方式1:根据语言匹配对应菜单名称 $menu_name = ($current_lang == 'zh') ? '移动端菜单' : 'Mobile Menu'; // 方式2:更推荐用菜单ID(替换为你实际的菜单ID) // $menu_id = ($current_lang == 'zh') ? 5 : 6; // $menu_items = wp_get_nav_menu_items($menu_id); $menu_items = wp_get_nav_menu_items($menu_name); // 调试用:若菜单为空,输出当前语言和尝试加载的菜单名(上线前移除) if (!$menu_items) { echo '当前语言:' . $current_lang . ',尝试加载的菜单:' . $menu_name; } if ($menu_items) { echo '<ul class="list-unstyled">'; foreach ($menu_items as $menu_item) { if ($menu_item->menu_item_parent == 0) { echo '<li>'; if (count_menu_items_by_parent($menu_item->ID, $menu_items)) { echo '<a class="sub-menu-parent" href="javascript:void(0)">' . esc_html($menu_item->title) . '</a>'; } else { echo '<a href="' . esc_url($menu_item->url) . '">' . esc_html($menu_item->title) . '</a>'; } echo '<ul class="sub-menu">'; foreach ($menu_items as $sub_menu_item) { if ($sub_menu_item->menu_item_parent == $menu_item->ID) { echo '<li><a href="' . esc_url($sub_menu_item->url) . '">' . esc_html($sub_menu_item->title) . '</a></li>'; } } echo '</ul>'; echo '</li>'; } } echo '</ul>'; } ?>
关键修复点
- 将函数定义移至代码最前端,避免菜单为空时的函数未定义问题。
- 通过
pll_current_language()适配多语言菜单名称,确保当前语言环境下能加载正确菜单。 - 增加
esc_url()和esc_html()进行安全转义,符合WordPress开发规范。 - 添加调试输出,方便快速定位菜单是否存在的问题。
内容的提问来源于stack exchange,提问作者WP Learner
相关产品推荐
相关产品推荐

