我试图将导航的第一个子菜单包装到一个单独的div中。所有子菜单或子菜单都不应该得到相同的处理。
我真的是新手,我真的很挣扎,可能需要一些帮助
这就是我试图实现的结构:
<ul class="menu">
<li class="menu-item">
<a href="#">Menu Item</a>
<!-- wrapper-class around the first sub-menu -->
<div class="sub-menu__wrapper">
<ul class="sub-menu">
<li class="menu-item">
<a href="#">Menu Item</a>
<!-- NO wrapper-class around following levels -->
<ul class="sub-menu">
<li>...</li>
</ul>
</li>
</ul>
</div>
</li>
</ul>
我认为使用一个简单的if语句很容易做到,它只在第一级打印子菜单\\uu包装器,但不知何故,下面的HTML输出被搞得一团糟。
这是我的学步课:
class sublevel_wrapper extends Walker_Nav_Menu {
function start_lvl( &$output, $depth = 0, $args = array() ) {
if ($depth == 0) {
$output .= "<div class=\'sub-menu__wrapper\'><ul class=\'sub-menu\'>\\n";
}
//$output .= "<ul class=\'sub-menu\'>\\n";
}
function end_lvl( &$output, $depth = 0, $args = array() ) {
if ($depth == 0) {
$output .= "</ul></div>\\n";
}
//$output .= "</ul>\\n";
}
}
打印以下结构:
<ul class="menu">
<li class="menu-item">
<a href="#">Menu Item</a>
<!-- wrapper-class around the first sub-menu -->
<div class="sub-menu__wrapper">
<ul class="sub-menu">
<li class="menu-item">Parent Menu Item</li>
<!-- the following items are supposed to be nested in the "parent menu item" before -->
<li class="menu-item">Child Menu Item</li>
<li class="menu-item">Child Menu Item</li>
<li class="menu-item">Child Menu Item</li>
<li class="menu-item">Parent Menu Item</li>
<!-- again the following items are supposed to be nested in the "parent menu item" before -->
<li class="menu-item">Child Menu Item</li>
<li class="menu-item">Child Menu Item</li>
<li class="menu-item">Child Menu Item</li>
...
</ul>
</div>
</li>
</ul>
正如您在我试图更改输出的注释中所看到的,如果if语句为false,那么输出会更加混乱
我们非常感谢任何帮助、建设性的批评或朝着正确的方向前进
最合适的回答,由SO网友:Jörg Mayer 整理而成
老实说,我真的不知道为什么我的解决方案有效,但它确实有效
我将我的代码片段基于此解决方案,并根据需要调整输出:Custom nav walker with different output depending on depth
class sublevel_wrapper extends Walker_Nav_Menu {
// add classes to ul sub-menus
function start_lvl( &$output, $depth = 0, $args = array() ) {
// depth dependent classes
$indent = ( $depth > 0 ? str_repeat( "\\t", $depth ) : \'\' ); // code indent
$display_depth = ( $depth + 1); // because it counts the first submenu as 0
$classes = array(
\'sub-menu\',
\'menu-depth-\' . $display_depth
);
$class_names = implode( \' \', $classes );
// build html
if ($display_depth == 1) {
$output .= "\\n" . $indent . \'<div class="sub-menu__wrapper"><ul class="\' . $class_names . \'">\' . "\\n";
} else {
$output .= "\\n" . $indent . \'<ul class="\' . $class_names . \'">\' . "\\n";
}
}
}
与我的第一段代码相比,无论出于何种原因,他完全省略了end\\u lvl-function。我还喜欢他添加$display\\u depth-variable的方式。