WordPress菜单前端渲染问题:子项层级显示与<li>计数换行求助
WordPress菜单子项按数量分组(每4个生成新行块)解决方案
你现在遇到的问题是WordPress菜单调用时,子项没法按照每4个一组拆分到新的<li><ul class="rd-megamenu-list">容器里,对吧?我给你调整一下代码逻辑,就能实现这个需求:
核心思路
新增一个专门统计子项数量的计数器,每次输出子项时累加计数,当计数达到4或者当前是父项的最后一个子项时,就闭合当前的行块容器,并重置计数器,准备下一组的输出。
修改后的完整代码片段
<ul class="rd-navbar-nav"> <?php $count = 0; $submenu = false; $sub_item_count = 0; // 新增子项计数器 foreach( $menuitems as $item ): $link = $item->url; $title = $item->title; // 处理父菜单项 if ( !$item->menu_item_parent ): $parent_id = $item->ID; $sub_item_count = 0; // 切换父项时重置子项计数器 ?> <li> <a href="<?php echo $link; ?>" class="title"> <?php echo $title; ?> </a> <?php endif; ?> <?php if ( $parent_id == $item->menu_item_parent ): ?> <?php if ( !$submenu ): $submenu = true; ?> <ul class="rd-navbar-megamenu"> <?php endif;?> <!-- 开始处理子项分组逻辑 --> <?php if ($sub_item_count % 4 == 0): ?> <li> <ul class="rd-megamenu-list"> <?php endif; ?> <li><a href="<?php echo $link; ?>" class="title"><?php echo $title; ?></a></li> <?php $sub_item_count++; // 判断是否需要闭合当前分组:要么满4个,要么是当前父项的最后一个子项 $is_last_subitem = false; if (isset($menuitems[$count + 1])) { $is_last_subitem = ($menuitems[$count + 1]->menu_item_parent != $parent_id); } else { $is_last_subitem = true; } if ($sub_item_count % 4 == 0 || $is_last_subitem): ?> </ul> </li> <?php endif; ?> <!-- 结束子项分组逻辑 --> <?php if ( $is_last_subitem && $submenu ): ?> </ul> <?php $submenu = false; endif; ?> <?php endif; ?> <?php if ( isset($menuitems[$count + 1]) && $menuitems[$count + 1]->menu_item_parent != $parent_id ): ?> </li> <?php $submenu = false; endif; ?> <?php $count++; endforeach; ?> </ul>
代码说明
- 新增
$sub_item_count计数器:用来跟踪当前父项下面已经输出的子项数量,切换父项时会重置这个计数器,避免不同父项的子项计数混淆。 - 分组判断逻辑:
- 当
$sub_item_count是4的倍数时(也就是第1、5、9...个子项),打开新的<li><ul class="rd-megamenu-list">容器。 - 每输出一个子项后计数器加1,当计数器达到4或者当前是父项的最后一个子项时,闭合当前的容器标签,完成一组的输出。
- 当
- 最后子项处理:避免父项的子项总数不是4的倍数时,最后一组标签无法闭合的问题,专门判断了是否是当前父项的最后一个子项。
这样修改后,你的菜单子项就会自动按每4个一组拆分到新的行块里,和你提供的HTML模板结构完全匹配啦。
内容的提问来源于stack exchange,提问作者Mu Lem
相关产品推荐
相关产品推荐

