web-dev-qa-db-fra.com

Ajouter une classe à un élément actif et à son parent dans le menu de navigation

J'utilise le code suivant pour ajouter un nom de classe "actif" à l'élément de menu actuel:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {
  if( $item->menu_item_parent == 0 && in_array('current-menu-item', $classes) ) {
    $classes[] = "active";
  }

  return $classes;
}

Cela fonctionne comme un charme, mais seulement pour les articles sans liste déroulante. Si un élément contient des enfants, la classe active ne sera pas ajoutée à l'élément parent.

Est-il possible de modifier ce code afin que le filtre ajoute une classe "active" au lien actuel et à son parent?

2
Johann

En fonction du contexte dont vous avez besoin et du code que vous avez, vous pouvez essayer ceci:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {
  $class_names = array( 'current-menu-item', 'current-menu-ancestor', 'current-menu-parent', 'current_page_parent',  'current_page_ancestor' );

  if( $item->menu_item_parent == 0 && in_array( $class_names, $classes) ) {
    $classes[] = "active";
  }

  return $classes;
}

UPDATE: si ci-dessus ne fonctionne pas à cause du tableau utilisé comme aiguille pour la fonction in_array à cause de la version PHP, essayez le code ci-dessous:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {

  if( $item->menu_item_parent == 0 && 
    in_array( 'current-menu-item', $classes ) ||
    in_array( 'current-menu-ancestor', $classes ) ||
    in_array( 'current-menu-parent', $classes ) ||
    in_array( 'current_page_parent', $classes ) ||
    in_array( 'current_page_ancestor', $classes )
    ) {

    $classes[] = "active";
  }

  return $classes;
}

Si vous souhaitez que la classe soit active pour un élément en cours, procédez comme suit:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {

  if( in_array( 'current-menu-item', $classes ) ||
    in_array( 'current-menu-ancestor', $classes ) ||
    in_array( 'current-menu-parent', $classes ) ||
    in_array( 'current_page_parent', $classes ) ||
    in_array( 'current_page_ancestor', $classes )
    ) {

    $classes[] = "active";
  }

  return $classes;
}
2
user23654