Agregar contenedor al submenú nav_menu

9

¿Hay alguna manera de que pueda ajustar un div alrededor del menú secundario ul de wp_nav_menu?

Entonces, por ejemplo, el marcado iría de

<ul class="menu">

    <li><a href="/">Item 1</a></li>
    <li>
        <a href="/">Item 2</a>

        <ul class="sub-menu">

            <li><a href="/">Item 1</a></li>
            <li><a href="/">Item 1</a></li>

        </ul>
   </li>
    <li><a href="/">Item 1</a></li>
    <li><a href="/">Item 1</a></li>

</ul>

a esto

<ul class="menu">

    <li><a href="/">Item 1</a></li>
    <li>
        <a href="/">Item 2</a>

        <div class="sub-menu-wrap">

            <ul class="sub-menu">

                <li><a href="/">Item 1</a></li>
                <li><a href="/">Item 1</a></li>

            </ul>

        </div>

   </li>

    <li><a href="/">Item 1</a></li>
    <li><a href="/">Item 1</a></li>

</ul>

Donde "sub-menu-wrap" es el div personalizado.

es posible?

Dean Elliott
fuente

Respuestas:

21

Use un andador personalizado , amplíe los métodos start_lvl()y end_lvl.

Código de muestra, no probado:

class WPSE_78121_Sublevel_Walker extends Walker_Nav_Menu
{
    function start_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\t", $depth);
        $output .= "\n$indent<div class='sub-menu-wrap'><ul class='sub-menu'>\n";
    }
    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\t", $depth);
        $output .= "$indent</ul></div>\n";
    }
}

Uso en su tema:

wp_nav_menu(
    array (
        'theme_location' => 'your-theme-location-EDIT-THIS',
        'walker'         => new WPSE_78121_Sublevel_Walker
    )
);
fuxia
fuente
¿Es posible realizar cambios por elemento de menú? por ejemplo, ¿está disponible la clase de elemento de menú dentro Walker_Nav_Menuy son niños?
Dan
@Dan. Sí lo es.
fuxia
@fuxia, ¿este enfoque sigue siendo saludable para WP 5+, o recomienda una técnica alternativa para lograr lo mismo?
klewis
@klewis Esto aún debería funcionar.
fuxia
Cómo hacer esto solo en el primer nivel.
jho1086