Aggiungere un contenitore al sotto menu nav_menu
C'è un modo per avvolgere un div intorno al sotto menu ul.sub-menu di wp_nav_menu?
Per esempio, vorrei trasformare il markup da questo:
<ul class="menu">
<li><a href="/">Elemento 1</a></li>
<li>
<a href="/">Elemento 2</a>
<ul class="sub-menu">
<li><a href="/">Elemento 1</a></li>
<li><a href="/">Elemento 1</a></li>
</ul>
</li>
<li><a href="/">Elemento 1</a></li>
<li><a href="/">Elemento 1</a></li>
</ul>
a questo:
<ul class="menu">
<li><a href="/">Elemento 1</a></li>
<li>
<a href="/">Elemento 2</a>
<div class="sub-menu-wrap">
<ul class="sub-menu">
<li><a href="/">Elemento 1</a></li>
<li><a href="/">Elemento 1</a></li>
</ul>
</div>
</li>
<li><a href="/">Elemento 1</a></li>
<li><a href="/">Elemento 1</a></li>
</ul>
Dove "sub-menu-wrap" è il div personalizzato.
È possibile farlo?
Utilizza un walker personalizzato, estendi i metodi start_lvl()
e end_lvl
.
Codice di esempio, non testato:
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";
}
}
Utilizzo nel tuo tema:
wp_nav_menu(
array (
'theme_location' => 'your-theme-location-EDIT-THIS',
'walker' => new WPSE_78121_Sublevel_Walker
)
);

È possibile apportare modifiche per singola voce del menu? Ad esempio, la classe della voce del menu è disponibile all'interno di Walker_Nav_Menu
e dei suoi figli?

@fuxia, questo approccio è ancora valido per WP 5+, o consigli una tecnica alternativa per ottenere lo stesso risultato?

La soluzione proposta non funziona bene con WordPress - il codice predefinito e i filtri di WordPress vengono ignorati. Ecco una soluzione molto più elegante, che mantiene tutti i filtri come 'nav_menu_submenu_css_class' e il resto del codice predefinito di WordPress funzionante:
<?php
/**
* Incapsula i sottomenu in un elemento div
*/
class My_Menu_Walker extends Walker_Nav_Menu {
public function start_lvl( &$output, $depth = 0, $args = null ) {
$output .=
'<div class="wrapper">';
parent::start_lvl($output, $depth, $args);
}
public function end_lvl( &$output, $depth = 0, $args = null ) {
parent::end_lvl($output, $depth, $args);
$output .= '</div>';
}
}
