如何在Walker_Nav_Menu中检测菜单项的browse all类
解决WordPress自定义菜单中为指定父项子菜单添加按钮的问题
要实现仅为带有browse all类的父菜单项的子菜单包裹容器添加按钮,需要在Walker_Nav_Menu中跟踪当前父菜单项的类,并在生成子菜单结尾时判断是否插入按钮。具体修改如下:
class My_Walker extends Walker_Nav_Menu { // 新增属性存储当前父项是否包含目标类 private $current_parent_has_browse_all = false; function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) { // 执行父类默认逻辑,保证菜单基础结构正常生成 parent::start_el($output, $item, $depth, $args, $id); // 仅处理一级菜单且该菜单项有子菜单的情况 if ($depth === 0 && $args->has_children) { // 检查当前菜单项的类是否包含"browse all" $this->current_parent_has_browse_all = in_array('browse all', $item->classes); } } function start_lvl(&$output, $depth = 0, $args = array()) { $indent = str_repeat("\t", $depth); if ($depth == 0) { $output .= "\n$indent<div class='sub-menu__depth-1'><ul class='sub-menu sub-menu__main'>\n"; } else { $output .= "\n$indent<ul class='sub-menu'>\n"; } } function end_lvl(&$output, $depth = 0, $args = array()) { $indent = str_repeat("\t", $depth); if ($depth == 0) { $output .= "$indent</ul>"; // 如果当前父项包含目标类,插入按钮 if ($this->current_parent_has_browse_all) { $output .= "\n$indent\t<a href='#' class='browse-all-btn'>Browse All</a>"; // 重置标记,避免影响下一个菜单项 $this->current_parent_has_browse_all = false; } $output .= "\n$indent</div>\n"; } else { $output .= "$indent</ul>\n"; } } }
关键逻辑说明
- 新增
$current_parent_has_browse_all属性,临时存储当前要生成子菜单的父项是否携带browse all类 - 在
start_el方法中,检测一级菜单且带有子菜单的项,判断其类列表是否包含目标类并更新标记 - 在
end_lvl处理一级子菜单结尾时,根据标记决定是否插入按钮,插入后重置标记避免干扰后续菜单
内容的提问来源于stack exchange,提问作者yanksi_
相关产品推荐
相关产品推荐

