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

如何让WordPress子菜单显示当前页面子链接及自定义链接?

解决WordPress子菜单包含自定义链接的问题

这个问题我之前也遇到过——用wp_list_pages确实只能抓取WordPress的页面内容,完全没法识别你在菜单里手动加的自定义链接。要解决这个问题,得把思路从「页面层级」切换到「菜单本身的结构」上来,直接用wp_nav_menu相关的函数来实现,这样就能包含所有你在后台菜单里添加的内容(页面、自定义链接、分类等)。

核心思路

  1. 先找到当前页面在你的导航菜单中对应的菜单项
  2. 确定这个菜单项的父级(如果它本身就是父级,就用它自己的ID)
  3. 调用wp_nav_menu只输出该父级下的所有子菜单(包括自定义链接)

完整代码示例

<?php
// 获取当前页面ID
$current_page_id = get_the_ID();

// 替换成你后台创建的菜单的slug(在外观->菜单里可查看)
$target_menu_slug = 'main-menu';

// 获取目标菜单的所有菜单项
$all_menu_items = wp_get_nav_menu_items($target_menu_slug);

$current_menu_item_id = 0;
$parent_menu_id = 0;

// 遍历菜单,找到当前页面对应的菜单项
foreach ($all_menu_items as $item) {
    // 情况1:菜单项关联的是当前页面
    if ($item->object_id == $current_page_id && $item->object === 'page') {
        $current_menu_item_id = $item->ID;
        // 如果当前项有父级,用父级ID;否则用自身ID(作为父级)
        $parent_menu_id = $item->menu_item_parent ? $item->menu_item_parent : $current_menu_item_id;
        break;
    }
    // 情况2:菜单项是指向当前页面的自定义链接(可选,根据你的需求调整)
    if ($item->object === 'custom' && $item->url === get_permalink($current_page_id)) {
        $current_menu_item_id = $item->ID;
        $parent_menu_id = $item->menu_item_parent ? $item->menu_item_parent : $current_menu_item_id;
        break;
    }
}

// 如果找到对应的父级菜单ID,就输出子菜单
if ($parent_menu_id) {
    // 获取父级菜单项的信息,用于输出标题
    $parent_menu_item = wp_get_nav_menu_item($parent_menu_id);
    ?>
    <div class="page-links">
        <h2 class="page-links__title">
            <a href="<?php echo esc_url($parent_menu_item->url); ?>">
                <?php echo esc_html($parent_menu_item->title); ?>
            </a>
        </h2>
        <div class="wave_page-links"></div>
        <ul class="min-list">
            <?php
            wp_nav_menu(array(
                'menu' => $target_menu_slug,
                'container' => false, // 不生成默认的div容器
                'items_wrap' => '%3$s', // 只输出<li>列表项,外层ul我们已经手动写了
                'depth' => 1, // 只显示直接子级,避免多级嵌套
                'child_of' => $parent_menu_id, // 仅显示指定父级下的子菜单
                'fallback_cb' => false, // 没有子菜单时不输出任何内容
            ));
            ?>
        </ul>
    </div>
    <?php
}
?>

关键说明

  • 菜单Slug替换:一定要把$target_menu_slug的值换成你自己的菜单slug,在WordPress后台「外观->菜单」页面,点击「菜单设置」就能看到。
  • 自定义链接适配:代码里额外加了自定义链接指向当前页面的判断,如果你不需要这种场景,可以删掉这部分逻辑。
  • 安全处理:用esc_url()和esc_html()处理链接和标题,避免XSS安全问题。
  • 层级控制:depth参数设为1表示只显示直接子菜单,如果你的菜单有多层嵌套,可以调整这个值(比如2表示显示两级)。

为什么原来的代码不行?

你之前用的wp_list_pages是基于WordPress的页面层级(child_of参数是页面ID),它只能抓取post_type为page的内容,而你在菜单里添加的自定义链接不属于页面,自然不会被包含进来。改用wp_nav_menu的方式,直接从你创建的菜单结构中读取内容,就能完美兼容所有类型的菜单项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:10:02