Aggiungere la classe all'elemento attivo e al suo genitore nel menu di navigazione
Sto utilizzando il seguente codice per aggiungere il nome della classe "active" all'elemento corrente del menu:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
if( $item->menu_item_parent == 0 && in_array('current-menu-item', $classes) ) {
$classes[] = "active";
}
return $classes;
}
Questo funziona perfettamente, ma solo per gli elementi senza menu a discesa. Se c'è un elemento con elementi figli, non aggiungerà la classe active all'elemento genitore.
C'è un modo per modificare questo codice in modo che il filtro aggiunga una classe "active" sia al link corrente che al suo genitore?
A seconda del contesto in cui ti trovi e basandoti sul codice che hai, puoi provare questo:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
$class_names = array( 'current-menu-item', 'current-menu-ancestor', 'current-menu-parent', 'current_page_parent', 'current_page_ancestor' );
if( $item->menu_item_parent == 0 && in_array( $class_names, $classes) ) {
$classes[] = "active";
}
return $classes;
}
AGGIORNAMENTO: se il codice sopra non funziona a causa dell'array come parametro per la funzione in_array per via della versione PHP, prova questo codice:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
if( $item->menu_item_parent == 0 &&
in_array( 'current-menu-item', $classes ) ||
in_array( 'current-menu-ancestor', $classes ) ||
in_array( 'current-menu-parent', $classes ) ||
in_array( 'current_page_parent', $classes ) ||
in_array( 'current_page_ancestor', $classes )
) {
$classes[] = "active";
}
return $classes;
}
Se vuoi che qualsiasi elemento corrente abbia la classe active, puoi fare così:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
if( in_array( 'current-menu-item', $classes ) ||
in_array( 'current-menu-ancestor', $classes ) ||
in_array( 'current-menu-parent', $classes ) ||
in_array( 'current_page_parent', $classes ) ||
in_array( 'current_page_ancestor', $classes )
) {
$classes[] = "active";
}
return $classes;
}

Ciao @splashingpixels. Ho provato il tuo codice ma non sembra funzionare. Ho controllato il codice sorgente e la classe "active" non viene aggiunta.

Grazie @splashingpixels, sei fantastico! Codice perfetto. Solo un'altra domanda, non so se sia possibile o se sia una limitazione di Wordpress. Con questo codice, ora tutti gli elementi genitore hanno la classe "active" quando necessario. C'è un modo per fare in modo che quando clicco su un elemento del dropdown, venga aggiunta anche a lui la classe active? In modo che la classe "active" sia aggiunta sia al genitore che al figlio?

Sì, puoi farlo, vedi la risposta aggiornata... e per favore segnala come soluzione se ha funzionato per te... grazie.
