web-dev-qa-db-fra.com

Ajouter une classe aux éléments de menu d'un menu spécifique (nav_menu_css_class)

Ce code ajoute une classe supplémentaire à tous mes éléments de menu:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
  $classes[] = 'btn';
  return $classes;
}

Comment puis-je limiter ce filtre à mon menu principal (à l'emplacement du thème "menu principal")?

Cordialement,

Daniel

6
Daniel Baars

J'essayais également de résoudre ce problème et, tout en recherchant une solution, j'ai découvert que le filtre nav_menu_css_class excluait en réalité un troisième paramètre . Il s'agit d'un objet contenant des variables liées à votre menu et incluant la variable theme_location que vous pouvez utiliser pour appliquer de manière conditionnelle les noms de classe à un menu spécifique. Vous devez simplement vous assurer que vous définissez le theme_location lorsque vous appelez wp_nav_menu dans votre thème.
Voici un exemple:

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;
}
13
Dylan

Je suis tombé sur ce fil en essayant de résoudre le même problème - c'est ce que j'ai proposé. Je ne sais pas si cela fonctionne bien, puisqu'il sera appelé pour chaque élément de menu, mais il semble que les menus sont configurés comme des taxonomies dans WordPress. Vous pouvez donc utiliser has_term() pour déterminer si l'élément est dans un menu particulier. , et get_nav_menu_locations() pour extraire la liste des menus dans quel emplacement de thème.

Modifier votre code:

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;
}
3
epowell

Vous n'avez pas besoin de modifier votre functions.php. Allez simplement dans votre fichier de modèle et trouvez wp_nav_menu et ajoutez-lui 'menu_class'.

<?php wp_nav_menu( array( 'theme_location' => 'primary','menu_class' => 'newmenuclass' ) ); ?>
1
jianli

L'ajouter à moi dans function.php et tout fonctionnera

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;
}
0