Come stilizzare la voce di menu corrente quando si usa un walker
Ho progettato un menu personalizzato e vorrei poter stilizzare i singoli li in base al fatto che sia la pagina corrente o meno. Credo che normalmente sia abbastanza semplice usando una classe come current-menu-item. Tuttavia sto anche usando un walker nel mio nav per mostrare un campo descrizione aggiuntivo - questo sembra disabilitarlo, qualcuno può aiutarmi??
<div id="navigation">
<?php
$walker = new My_Walker;
wp_nav_menu(array( 'menu' => 'nav','walker' => $walker ) );
?>
</div><!-- END navigation -->
AGGIORNAMENTO:
class My_Walker extends Walker_Nav_Menu
{
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
$class_names = '';
$output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
$item_output .= '<span>' . $item->description . '</span>';
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}

Una risposta tardiva ma ho pensato di contribuire dato che questa pagina era tra i primi risultati su Google quando cercavo una soluzione a questo problema. Anch'io avevo trascurato il fatto che WP aggiunge di default la voce di menu della pagina corrente (grazie patnz per averlo fatto notare).
Tuttavia non sono soddisfatto di quanto sia gonfiato il markup quando si includono le classi predefinite, quindi per chiunque altro fosse interessato si potrebbe invece usare una riga di codice simile alla seguente:
$class_names = in_array("current_page_item",$item->classes) ? ' active' : '';
Per completezza - ecco come apparirebbe nel tuo esempio di codice:
class My_Walker extends Walker_Nav_Menu
{
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = in_array("current_page_item",$item->classes) ? ' active' : '';
$output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
$item_output .= '<span>' . $item->description . '</span>';
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}

Un'aggiunta molto tardiva, ma se usi un archivio di post type personalizzato come punto del menu, devi cambiare il controllo in_array
con "current-menu-item"
. Se fai questo, la funzione continua a funzionare anche su pagine singole o post.
Non sono sicuro se questo sia cambiato da quando questa risposta è stata scritta 10 anni fa, quindi la mia soluzione potrebbe non essere stata disponibile all'epoca.

Stai annullando i nomi delle classi predefinite quindi non vengono aggiunte.
//questo codice svuota le classi che dovrebbero essere aggiunte.
$class_names = '';
Prova questo:
class My_Walker extends Walker_Nav_Menu
{
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
$class_names = ' class="' . esc_attr( $class_names ) . '"';
$output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
$item_output .= '<span>' . $item->description . '</span>';
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}
