如何让WordPress子菜单显示当前页面子链接及自定义链接?
解决WordPress子菜单包含自定义链接的问题
这个问题我之前也遇到过——用wp_list_pages确实只能抓取WordPress的页面内容,完全没法识别你在菜单里手动加的自定义链接。要解决这个问题,得把思路从「页面层级」切换到「菜单本身的结构」上来,直接用wp_nav_menu相关的函数来实现,这样就能包含所有你在后台菜单里添加的内容(页面、自定义链接、分类等)。
核心思路
- 先找到当前页面在你的导航菜单中对应的菜单项
- 确定这个菜单项的父级(如果它本身就是父级,就用它自己的ID)
- 调用
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
相关产品推荐
相关产品推荐

