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

如何为WordPress移动端自定义菜单循环?代码无返回求助

Polylang多语言站点移动端自定义菜单无内容排查与修复

核心问题分析

你的代码无返回,大概率是多语言环境下菜单匹配失败或代码存在潜在逻辑问题:

  1. 多语言菜单名称不匹配:Polylang下不同语言的菜单通常会使用对应语言的名称(比如中文叫「移动端菜单」,英文叫「Mobile Menu」),直接硬编码英文名称会导致非英文语言环境下找不到对应菜单。
  2. 函数定义位置不合理:原代码中count_menu_items_by_parent函数定义在if ($menu_items)分支内,若菜单为空,函数未定义可能引发隐性错误。
  3. 缺少语言过滤: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:03:35