web-dev-qa-db-fra.com

Ajouter une classe à tous les éléments de la liste de wp_nav_menu

J'ai un wp_nav_menu auquel je veux ajouter une classe aux éléments de la liste. Je sais que cela peut être fait en choisissant "css classes" dans le menu d'options à l'écran, mais je dois ensuite donner à chaque classe li une classe.

J'ai un menu 2 profondeurs. (par exemple)

  • Tous les li normaux que je veux donner à la classe lidepth1
  • Tous les sous-menus que je veux donner à la classe lidept2

Est-ce possible dans la fonction wp_nav_menu? J'ai cherché le codex mais je n'ai trouvé que "lien avant" et "lien après" mais je ne pense pas que ce soit ce dont j'ai besoin.

2
Maartje

Il existe un filtre nav_menu_css_class . Il est trivial d'ajouter des classes.

function add_classes_wpse_130358($classes, $item, $args) {
  $classes[] = 'new-class';
  return $classes;
}
add_filter('nav_menu_css_class','add_classes_wpse_130358',1,3);

Mais vous devrez probablement étendre Walker_Nav_Menu ou utiliser le filtre walker_nav_menu_start_el à la place, car le filtre nav_menu_css_class n'a mystérieusement pas accès à la variable depth. Mais walker_nav_menu_start_el ne vous permet pas de définir les classes là où vous en avez besoin, donc supposons que votre PHP soit suffisamment nouveau ...

function depth_classes_wpse_130358($item_output, $item, $depth, $args) {
  add_action(
    'nav_menu_css_class',
    function() use ($depth) {
      $depth++;
      $classes[] = "depth-{$depth}";
      return $classes;
    }
  );
  return $item_output;
}
add_filter('walker_nav_menu_start_el','depth_classes_wpse_130358',1,4);

Vous obtiendrez un depth-N pour chaque niveau supérieur à 0.

Je ne me rappelle pas avoir jamais eu besoin de faire cela. Le balisage existant a toujours été suffisant, mais voilà.

7
s_ha_dum