69 votes

wp_nav_menu changer le nom de la classe de sous-menu?

Existe-t-il un moyen de changer l'enfant <ul class="sub-menu"> généré par Wordpress lui-même en un nom de classe personnalisé?

Je connais le parent ul que vous pouvez supprimer ou modifier le nom avec 'menu_class' => 'newname'

Je n'ai pas trouvé ... essayé 'submenu_class' => 'customname' : D me semble logique, mais ce n'est évidemment pas le bon.

des idées?

100voto

Richard M Points 8333

Il n'y a pas d'option pour cela, mais vous pouvez étendre l'objet 'Walker' que Wordpress utilise pour créer le menu HTML. Une seule méthode doit être remplacée:

 class My_Walker_Nav_Menu extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"my-sub-menu\">\n";
  }
}
 

Ensuite, vous passez juste une instance de votre marcheur comme argument à wp_nav_menu comme ceci:

 'walker' => new My_Walker_Nav_Menu()
 

20voto

vralle Points 41

remplacer la classe:

 echo str_replace('sub-menu', 'menu menu_sub', wp_nav_menu( array(
    'echo' => false,
    'theme_location' => 'sidebar-menu',
    'items_wrap' => '<ul class="menu menu_sidebar">%3$s</ul>' 
  ) )
);
 

11voto

Jonathan Wold Points 178

Voici une mise à jour de ce que Richard a fait qui ajoute un indicateur "de profondeur". La sortie est le niveau 0, le niveau 1, le niveau 2, etc.

 class UL_Class_Walker extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"level-".$depth."\">\n";
  }
}
 

6voto

zartgesotten Points 21

Comme toujours, après avoir cherché longtemps avant d'écrire quelque chose sur le site, une minute après avoir posté ici, j'ai trouvé ma solution.

Je pensais que je le partagerais ici pour que quelqu'un d'autre puisse le trouver.

 //Add "parent" class to pages with subpages, change submenu class name, add depth class

    class Prio_Walker extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
        $GLOBALS['dd_children'] = ( isset($children_elements[$element->ID]) )? 1:0;
        $GLOBALS['dd_depth'] = (int) $depth;
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

     function start_lvl(&$output, $depth) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class=\"children level-".$depth."\">\n";
  }
}

add_filter('nav_menu_css_class','add_parent_css',10,2);
function  add_parent_css($classes, $item){
     global  $dd_depth, $dd_children;
     $classes[] = 'depth'.$dd_depth;
     if($dd_children)
         $classes[] = 'parent';
    return $classes;
}

//Add class to parent pages to show they have subpages (only for automatic wp_nav_menu)

function add_parent_class( $css_class, $page, $depth, $args )
{
   if ( ! empty( $args['has_children'] ) )
       $css_class[] = 'parent';
   return $css_class;
}
add_filter( 'page_css_class', 'add_parent_class', 10, 4 );
 

C’est là que j’ai trouvé la solution: Solution sur le forum d’assistance Wordpress

0voto

Kundan SIngh Points 13

dans ce qui précède, j'ai besoin d'un petit changement que j'essaie de placer, mais je ne suis pas en mesure de le faire, votre sortie ressemblera à ceci

 <ul>
<li id="menu-item-13" class="depth0 parent"><a href="#">About Us</a>
<ul class="children level-0">
    <li id="menu-item-17" class="depth1"><a href="#">Sample Page</a></li>
    <li id="menu-item-16" class="depth1"><a href="#">About Us</a></li>
</ul>
</li>
</ul> 
 

ce que je cherche

 <ul>
<li id="menu-item-13" class="depth0"><a class="parent" href="#">About Us</a>
<ul class="children level-0">
    <li id="menu-item-17" class="depth1"><a href="#">Sample Page</a></li>
    <li id="menu-item-16" class="depth1"><a href="#">About Us</a></li>
</ul>
</li>
</ul> 
 

dans ce qui précède, j'ai placé la classe parente dans le lien d'ancrage parente qui <li id="menu-item-13" class="depth0"><a class="parent" href="#">About Us</a>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X