简单导航Walker-第一个子菜单的包装类

时间:2016-11-03 作者:Jörg Mayer

我试图将导航的第一个子菜单包装到一个单独的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,那么输出会更加混乱

我们非常感谢任何帮助、建设性的批评或朝着正确的方向前进

2 个回复
最合适的回答,由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的方式。

SO网友:Roland Allla

function sevenMenu(  ) {
$menu_name = \'primary\'; // specify custom menu slug
$menu_list =\'\';
if (($locations = get_nav_menu_locations()) && isset($locations[$menu_name])) {
    $menu = wp_get_nav_menu_object($locations[$menu_name]);
    $menu_items = wp_get_nav_menu_items($menu->term_id);

    foreach( $menu_items as $menu_item ) {
        if( $menu_item->menu_item_parent == 0 ) {

            $parent = $menu_item->ID;

            $menu_array = array();
            foreach( $menu_items as $submenu ) {
                if( $submenu->menu_item_parent == $parent ) {
                    $bool = true;
                    $menu_array[] = \'<li><a href="\' . $submenu->url . \'">\' . $submenu->title . \'</a></li> \' ."\\n";
                }
            }
            if( $bool == true && count( $menu_array ) > 0 ) {
                $menu_list .= \'<li role="presentation" class="dropdown">\' ."\\n";
                $menu_list .= \'<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">\' . $menu_item->title . \' <span class="caret"></span></a>\' ."\\n";

                $menu_list .= \'<ul class="dropdown-menu">\' ."\\n";
                $menu_list .= implode( "\\n", $menu_array );
                $menu_list .= \'</ul>\' ."\\n";

            } else {

                $menu_list .= \'<li>\' ."\\n";
                $menu_list .= \'<a href="\' . $menu_item->url . \'">\' . $menu_item->title . \'</a>\' ."\\n";
                $menu_list .= \'<li>\' ."\\n";
            }

        }

        // end <li>

    }

} else {
    $menu_list = \'<!-- no menu defined in location "\'.$theme_location.\'" -->\';
}

echo $menu_list;}
查看此引导菜单,您可以在功能中添加此项。php更改menu\\u名称,并通过以下方式将此菜单调用到模板中:

<?php if (function_exists(sevenMenu())) sevenMenu(); ?>

相关推荐

WordPress中声明SplitMenuWalker::Walk($Elements,$max_Depth)时出现警告

我开始在WordPress网站上收到以下错误:警告:SplitMenuWalker::walk($elements,$max\\u depth)的声明应与/home/relati67/public\\u html/wp content/themes/mentis/inc/mega menu/split menu中的walk::walk($elements,$max\\u depth,$args)兼容。php第0行我不知道在这里该怎么办。我发现了一个具有类似内容的线程,但错误指向特定行(不是第0行),并且不