Añadir clase a elementos de un menú específico (nav_menu_css_class)

13 mar 2013, 11:21:56
Vistas: 19.7K
Votos: 6

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

0
Todas las respuestas a la pregunta 4
1
16

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;
}
2 mar 2015 02:21:12
Comentarios

en mi caso, llamé al menú mediante wp_nav_menu( ['menu' => 'main'] ); por lo que el $args->theme_location estaba vacío. pero el $args->name no lo estaba (ya que solo configuré esto..), así que usé este atributo y funciona..

honk31 honk31
23 feb 2017 18:39:36
0

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;
}
30 abr 2013 01:07:01
1

No necesitas modificar tu archivo functions.php. Simplemente ve a tu archivo de plantilla y encuentra wp_nav_menu y agrega 'menu_class' a este.

<?php wp_nav_menu( array( 'theme_location' => 'primary','menu_class' => 'newmenuclass' ) ); ?>
13 mar 2013 11:46:20
Comentarios

Gracias por la respuesta, pero necesito una clase para los elementos del menú (li), no para todo el menú (ul).

Daniel Baars Daniel Baars
13 mar 2013 18:07:49
0

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;
}
9 nov 2017 10:14:28