Ajouter la classe 'has_children' au parent li lors de la modification de Walker_Nav_Menu
5 réponses
- votes
-
- 2011-05-10
start_el()
devrait obtenir cetteinformation dans sonparamètre$args
,maiselle apparaît WordPressne le remplit que si$args
est untableau ,alors quepour le custommenus denavigation c'est un objet. Ceciest signalé dans unticket Trac . Maispas deproblème,vouspouvez le remplir vous-même,si vous remplacez également laméthodedisplay_element()
dans votremarcheurpersonnalisé (car c'est l'endroit leplus simplepour accéder autableau des élémentsenfants):class WPSE16818_Walker extends Walker_Nav_Menu { function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { $id_field = $this->db_fields['id']; if ( is_object( $args[0] ) ) { $args[0]->has_children = ! empty( $children_elements[$element->$id_field] ); } return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } function start_el( &$output, $item, $depth, $args ) { if ( $args->has_children ) { // ... } }
start_el()
should get this information in its$args
parameter, but it appears WordPress only fills this in if$args
is an array, while for the custom navigation menus it is an object. This is reported in a Trac ticket. But no problem, you can fill this in yourself, if you also override thedisplay_element()
method in your custom walker (because this is the easiest place to access the child element array):class WPSE16818_Walker extends Walker_Nav_Menu { function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { $id_field = $this->db_fields['id']; if ( is_object( $args[0] ) ) { $args[0]->has_children = ! empty( $children_elements[$element->$id_field] ); } return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } function start_el( &$output, $item, $depth, $args ) { if ( $args->has_children ) { // ... } }
-
Bonjour Jan,pouvez-vousm'aider avec [cette question] (http://wordpress.stackexchange.com/questions/41116/wordpress-nav-menu-using-twitter-bootstrap)?J'aiessayé votre codemaisje n'aipaspu lefairefonctionner.Pouvez-vousme donner un autreexemple de code?Hello Jan, Can you help me with [this question](http://wordpress.stackexchange.com/questions/41116/wordpress-nav-menu-using-twitter-bootstrap)? I tried your code but i couldn't make it work. Can you give me some more sample code?
- 0
- 2012-02-03
- Giri
-
Reportez-vous à l '[exemple d'implémentation complet] (http://wordpress.stackexchange.com/a/89696/8495)plusbas sur cettepage.Refer to the [complete implementation example](http://wordpress.stackexchange.com/a/89696/8495) further down on this page.
- 0
- 2013-03-06
- rjb
-
Mercibeaucoup @Janfabry .. J'ai été retenu avecmonmarcheurpersonnalisé .. Enfin votreextrait de codem'a aidé.Thanks a lot @Jan fabry.. I was held up with my custom walker.. Atlast your snippet helped me.
- 0
- 2014-05-05
- Harish Chinju
-
- 2013-03-06
Mise àjour: àpartir de WordPress 3.7 (octobre 2013 ),Des classes CSS ont été ajoutéespourindiquer les éléments demenuenfantet lespages dans lesmenus dethème -pasbesoin d'utiliser unmarcheurpersonnalisé carilestprisen charge dans lenoyau WordPress.
Les classes CSS sontnommées
menu-item-has-children
etpage_item_has_children
.Pour une solution complètepourtoutepersonnepressée (grâce à la réponseprécédente de Jan Fabry),consultez lamiseen œuvre complète ci-dessous.
Affichez lanavigation dans lemodèle de votrethème:
wp_nav_menu( array( 'theme_location' => 'navigation-primary', 'container' => false, 'container_class' => '', 'container_id' => '', 'menu_class' => '', 'menu_id' => '', 'walker' => new Selective_Walker(), 'depth' => 2 ) );
Ensuite,incluez les éléments suivants dans le
La classefunctions.php
de votrethème:class Selective_Walker extends Walker_Nav_Menu { function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { $id_field = $this->db_fields['id']; if ( is_object( $args[0] ) ) { $args[0]->has_children = !empty( $children_elements[$element->$id_field] ); } return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } function start_el( &$output, $item, $depth, $args ) { if ( $args->has_children ) { $item->classes[] = 'has_children'; } parent::start_el(&$output, $item, $depth, $args); } }
La sortie HTML résultante ressemblera à ce qui suit:
<ul> <li><a href="#">Home</a></li> <li class="has_children"><a href="#">About</a> <ul class="sub-menu"> <li><a href="#">Our Mission</a></li> </ul> </li> <li><a href="#">Services</a></li> <li class="has_children"><a href="#">Products</a> <ul class="sub-menu"> <li><a href="#">Lorem Ipsum</a></li> <li><a href="#">Lorem Ipsum</a></li> </ul> </li> <li><a href="#">Contact Us</a></li> </ul>
Pourplus d'informations sur l'utilisation de la classe walker de WordPress,consultez Comprendre la classe Walker .
Profitez-en!
Update: As of WordPress 3.7 (October 2013), CSS classes have been added to indicate child menu items and pages in theme menus — no need to use a custom walker as it's taken care of in WordPress core.
The CSS classes are named
menu-item-has-children
andpage_item_has_children
.
For a complete solution for anybody in a hurry (credit to Jan Fabry's previous answer), see the full implementation below.
Output the navigation in your theme's template:
wp_nav_menu( array( 'theme_location' => 'navigation-primary', 'container' => false, 'container_class' => '', 'container_id' => '', 'menu_class' => '', 'menu_id' => '', 'walker' => new Selective_Walker(), 'depth' => 2 ) );
Then, include the following in your theme's
functions.php
:class Selective_Walker extends Walker_Nav_Menu { function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { $id_field = $this->db_fields['id']; if ( is_object( $args[0] ) ) { $args[0]->has_children = !empty( $children_elements[$element->$id_field] ); } return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } function start_el( &$output, $item, $depth, $args ) { if ( $args->has_children ) { $item->classes[] = 'has_children'; } parent::start_el(&$output, $item, $depth, $args); } }
The resulting HTML output will resemble the following:
<ul> <li><a href="#">Home</a></li> <li class="has_children"><a href="#">About</a> <ul class="sub-menu"> <li><a href="#">Our Mission</a></li> </ul> </li> <li><a href="#">Services</a></li> <li class="has_children"><a href="#">Products</a> <ul class="sub-menu"> <li><a href="#">Lorem Ipsum</a></li> <li><a href="#">Lorem Ipsum</a></li> </ul> </li> <li><a href="#">Contact Us</a></li> </ul>
For more information on using WordPress' walker class, see Understanding the Walker Class.
Enjoy!
-
Erreurfatale: lepassagepar référence aumoment de l'appel a été supprimé dans D: \ www \ wordpress \ wp-content \themes \ wpt_theme \functions.php à la ligne 44Fatal error: Call-time pass-by-reference has been removed in D:\www\wordpress\wp-content\themes\wpt_theme\functions.php on line 44
- 0
- 2014-07-14
- Tahir Yasin
-
La lignen ° 44estparent :: start_el (& $ output,$item,$ depth,$ args);Line#44 is parent::start_el(&$output, $item, $depth, $args);
- 0
- 2014-07-14
- Tahir Yasin
-
- 2011-05-10
Cettefonctionestexactement ce que vous voulez avoir. Il vousmontre également unmoyen assezefficace demodifier les éléments dumenu denavigation. Deplus,vouspouvez l'ouvrirpour desfonctionsplus avancées (parexemple,thèmeenfant) via lefiltre d'élément:
/** * Classes for a navigation named "Topnav" in the nav location "top". * Shows examples on how to modify the current nav menu item * * @param (object) $items * @param (object) $menu * @param (object) $args */ function wpse16818_nav_menu_items( $items, $menu, $args ) { # >>>> start editing // examples for possible targets $target['name'] = 'Topnav'; // The targeted menu item/s $target['items'] = array( (int) 6 ); # <<<< stop editing // filter for child themes: "config_nav_menu_topnav" $target = apply_filters( 'config_nav_menu_'.strtolower( $target['name'] ), $target ); // Abort if we're not with the named menu if ( $menu->name !== $target['name'] ) return; foreach ( $items as $item ) { // Check what $item contains echo '<pre>'; print_r($item); echo '</pre>'; // First real world example: $item->classes = 'span-4'; // Second real world example: // Append this class if we are in one of the targeted items if ( in_array( (int) $item->menu_order, $target['items'] ) ) $item->classes .= ' last'; } return $items; } add_filter( 'wp_get_nav_menu_items', 'wpse16818_nav_menu_items', 10, 3 );
Et oui,iln'y a - danspresquetous les cas -pasbesoin d'un déambulateurpersonnalisé.
This function is exactly what you want to have. It also shows you a pretty effective way to modify nav menu items. Furthermore you can open it for more advanced (eg. child theme) functions via the item-filter:
/** * Classes for a navigation named "Topnav" in the nav location "top". * Shows examples on how to modify the current nav menu item * * @param (object) $items * @param (object) $menu * @param (object) $args */ function wpse16818_nav_menu_items( $items, $menu, $args ) { # >>>> start editing // examples for possible targets $target['name'] = 'Topnav'; // The targeted menu item/s $target['items'] = array( (int) 6 ); # <<<< stop editing // filter for child themes: "config_nav_menu_topnav" $target = apply_filters( 'config_nav_menu_'.strtolower( $target['name'] ), $target ); // Abort if we're not with the named menu if ( $menu->name !== $target['name'] ) return; foreach ( $items as $item ) { // Check what $item contains echo '<pre>'; print_r($item); echo '</pre>'; // First real world example: $item->classes = 'span-4'; // Second real world example: // Append this class if we are in one of the targeted items if ( in_array( (int) $item->menu_order, $target['items'] ) ) $item->classes .= ' last'; } return $items; } add_filter( 'wp_get_nav_menu_items', 'wpse16818_nav_menu_items', 10, 3 );
And yes, there's - in nearly every case - no need for a custom walker.
-
Merci,j'aibesoin dumarcheurpour l'instant,maisj'yjetterai un œilpour laprochainefois!Thanks, I need the walker for now but will have a look at this for next time round!
- 0
- 2011-05-10
- patnz
-
- 2011-05-10
si vous souhaitez créer une liste déroulante,vousne pouvez lefaire qu'avec css. créer unenavigationpersonnalisée dans WP avec desenfants,WordPress attribue automatiquement la classe .sub-menu à l'enfant ul.Essayez ce CSS
nav li {position:relative;} .sub-menu {display:none; position:absolute; width:300px;} nav ul li:hover ul {display:block;}
Vous voudrezpeut-être ajouter dujQuerypour lepimenter unpeu,mais cela devrait vous donner unmenu déroulantfonctionnel.
if you want to make drop down, you can do it with css only. make custom nav in WP with children, WordPress automatically assigns class .sub-menu to child ul. Try this CSS
nav li {position:relative;} .sub-menu {display:none; position:absolute; width:300px;} nav ul li:hover ul {display:block;}
You may want to add some jQuery to spice it up a little, but this should give you a working drop down menu.
-
Merci,c'estpour unmenu arborescentpliable àplusieursniveaux dans lequelj'insère également des éléments de contrôle,maisilest vraimentbon d'enfaire autant quepossible avec le CSS!Thanks, its for a multilevel collapsible tree menu that I'm inserting control elements into as well, but definitely good to do as much with css as possible!
- 0
- 2011-05-10
- patnz
-
-
Veuillezexpliquer ce quefait ce codeet commentil répond à la question.Please, explain what this code does and how it is answer the question.
- 3
- 2015-11-13
- cybmeta
-
Et veuillezposter le code dansplus de contexte.En l'état,laplupart des visiteursn'auront aucuneidée de l'endroit oùessayer de coller celaet setromperont.And please post the code in more context. As is, most people who visit will have no idea where to try to paste that and will get it wrong.
- 0
- 2015-11-14
- s_ha_dum
-
J'écris une classe demarcheurpersonnaliséepour wp_nav_menuet je veuxpouvoir spécifier si un li contient un sous-menu.Je veux donc quemonbalisage soit:
Je sais comment ajouteret supprimer les classestrèsbien,je netrouve rienpourme dire si l'élément actuel contient des élémentsenfants.
Desidées?
Merci d'avance.