Añadir clase a elementos de un menú específico (nav_menu_css_class)
Este código añade una clase adicional a todos los elementos de mi menú:
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
$classes[] = 'btn';
return $classes;
}
¿Cómo puedo limitar este filtro solo a mi menú principal (en la ubicación del tema 'primary-menu')?
Saludos,
Daniel
También estaba intentando resolver este problema y mientras buscaba una solución, descubrí que el filtro nav_menu_css_class
en realidad acepta un tercer parámetro. Este es un objeto que contiene variables relacionadas con tu menú e incluye la variable theme_location
que puedes usar para aplicar condicionalmente nombres de clases a un menú específico. Solo necesitas asegurarte de establecer el theme_location
cuando llames a wp_nav_menu en tu tema.
Aquí un ejemplo:
add_filter( 'nav_menu_css_class', 'special_nav_class', 10, 3 );
function special_nav_class( $classes, $item, $args ) {
if ( 'primary-menu' === $args->theme_location ) {
$classes[] = 'btn';
}
return $classes;
}

Me encontré con este hilo intentando resolver el mismo problema - esto es lo que se me ocurrió. No sé qué tan bien funciona esto, ya que se llamará para cada elemento del menú, pero parece que los menús están configurados como taxonomías dentro de WordPress, por lo que puedes usar has_term()
para determinar si el elemento está en un menú particular, y get_nav_menu_locations()
para obtener la lista de qué menús están en qué ubicación del tema.
Modificando tu código:
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
$menu_locations = get_nav_menu_locations();
if ( has_term($menu_locations['primary-menu'], 'nav_menu', $item) ) {
$classes[] = 'btn';
}
return $classes;
}

Añadiéndolo a mi mismo en function.php y todo funcionará
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class ($classes, $item) {
$classes[] = 'nav__link';
if (in_array('current-menu-item', $classes) ){
$classes[] = 'nav__link-active';
}
return $classes;
}
