Je travaille sur un thème personnalisé en utilisant wp_nav_menu (). Ce que je veux faire, c'est ajouter un curseur aux éléments de menu comportant des sous-menus. Par exemple, si mon menu ressemble à ceci:
Je veux pouvoir le formater comme ceci:
Sans connaître la structure du menu. Cela ressemble à un problème de formatage assez courant, donc je me demandais s’il existe une fonctionnalité intégrée pour fournir cela.
Je le fais en utilisant jQuery (puisqu'il n'a pas nécessairement besoin d'être dans le texte (pour les lecteurs d'écran, etc.) - juste une autre option ...:
jQuery(document).ready(function() {
jQuery('ul#nav li').has('ul').addClass('parentul');
});
Ensuite, pour cette classe "parentul", je mets l'image de fond d'une flèche et la positionne à droite> ...
Vous pouvez le faire en utilisant un lecteur personnalisé. Collez la classe suivante au bas de votre fichier functions.php:
class Nfr_Menu_Walker extends Walker_Nav_Menu{
/**
* Traverse elements to create list from elements.
*
* Display one element if the element doesn't have any children otherwise,
* display the element and its children. Will only traverse up to the max
* depth and no ignore elements under that depth. It is possible to set the
* max depth to include all depths, see walk() method.
*
* This method shouldn't be called directly, use the walk() method instead.
*
* @since 2.5.0
*
* @param object $element Data object
* @param array $children_elements List of elements to continue traversing.
* @param int $max_depth Max depth to traverse.
* @param int $depth Depth of current element.
* @param array $args
* @param string $output Passed by reference. Used to append additional content.
* @return null Null on failure with no changes to parameters.
*/
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
if ( !$element )
return;
$id_field = $this->db_fields['id'];
//display this element
if ( is_array( $args[0] ) )
$args[0]['has_children'] = ! empty( $children_elements[$element->$id_field] );
//Adds the 'parent' class to the current item if it has children
if( ! empty( $children_elements[$element->$id_field] ) ) {
array_Push($element->classes,'parent');
$element->title .= ' >';
}
$cb_args = array_merge( array(&$output, $element, $depth), $args);
call_user_func_array(array(&$this, 'start_el'), $cb_args);
$id = $element->$id_field;
// descend only when the depth is right and there are childrens for this element
if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) {
foreach( $children_elements[ $id ] as $child ){
if ( !isset($newlevel) ) {
$newlevel = true;
//start the child delimiter
$cb_args = array_merge( array(&$output, $depth), $args);
call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
}
$this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
}
unset( $children_elements[ $id ] );
}
if ( isset($newlevel) && $newlevel ){
//end the child delimiter
$cb_args = array_merge( array(&$output, $depth), $args);
call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
}
//end this element
$cb_args = array_merge( array(&$output, $element, $depth), $args);
call_user_func_array(array(&$this, 'end_el'), $cb_args);
}
}
Et ensuite dans header.php (ou quel que soit votre wp_nav_menu), faites quelque chose comme ceci:
<?php
$walker = new Nfr_Menu_Walker();
wp_nav_menu( array( 'theme_location' => 'primary', 'walker' => $walker ) );
?>
La partie clé du marcheur est la suivante si déclaration:
if( ! empty( $children_elements[$element->$id_field] ) ) {
array_Push($element->classes,'parent');
$element->title .= ' >';
}
Cela vérifie si l'élément a des enfants et, le cas échéant, il y ajoute la classe css "parent", puis modifie le titre de "xxxx" en "xxxx>".
(Adapté de http://wordpress.org/support/topic/wp_nav_menu-add-a-parent-class )
De nos jours, il semblerait que WordPress génère lui-même une classe menu-item-has-children
dans un menu li
comportant un ul.sub-menu
.
On peut facilement y ajouter des styles pour ajouter une image d’arrière-plan plutôt que de devoir utiliser jQuery ou similaire.