J'ai des problèmes pour faire fonctionner un filtre. J'essaie d'ajouter une classe à chaque élément <li>
d'un menu. C'est sur le fichier functions.php
de mon thème:
/**
* Adds custom classes to the items in the nav menu
*
* @param array $classes Classes for the body element.
* @return array
*/
function nav_menu_item_classes( $classes, $item, $args, $depth ) {
// This is what I used to check that it's not working
error_log("is nav_menu_item_classes working?");
if ( 'menu-1' === $args->theme_location ) {
// Add the Bootstrap nav-item class
$classes[] = 'nav-item';
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'nav_menu_item_classes', 10, 4 );
Voici comment j'appelle le menu de mon fichier header.php
:
<?php
wp_nav_menu( array(
'theme_location' => 'menu-1',
'menu_id' => 'primary-menu',
'menu_class' => 'navbar-nav',
) );
?>
Tout semble correspondre, mais le filtre n'est pas exécuté. Quel pourrait être le problème?
Le filtre nav_menu_css_class
est situé dans la fonction start_el
de la classe de marcheur de WP. Comme vous pouvez le voir dans le source, il n'y a pas d'exécution conditionnelle ici, donc une fois que le marcheur est appelé, le filtre doit être appliqué.
Cela nous amène à wp_nav_menu
, qui appelle le marcheur (par le biais d’appels intermédiaires) sur la ligne où il est écrit: $items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );
. Donc, si quelque chose empêche le filtre d'être appelé, cela doit se produire avant cette ligne. En réalité, il y a trois possibilités:
Vous voyez d’abord un filtre appelé wp_nav_menu_args
. Si cela est utilisé, il se peut que vous ajoutiez un programme personnalisé qui n'appelle pas le filtre.
Deuxièmement, il y a le filtre pre_wp_nav_menu
. Si cela est utilisé, le reste de la fonction est court-circuité et n'atteint jamais le marcheur.
Enfin, s’il n’ya pas d’éléments dans votre menu et qu’aucun repli n’est défini, le marcheur sera également ignoré. S'il y a un repli (éventuellement ajouté avec wp_nav_menu_args
), cela produira la sortie au lieu du marcheur.