web-dev-qa-db-fra.com

wp_nav_menu ne génère pas de classes parent/ancêtre

Je ne sais pas pourquoi les classes appropriées pour les éléments de menu ne sont pas générées - tous les éléments de l’arbre contenant un sous-arbre n’obtiennent que menu-item menu-item-type-post_type. Les éléments, qui n'ont pas d'enfants, obtiennent les classes appropriées après avoir été cliqué (actif).

Lien: http://lichens.ie/

Partie de la structure du menu: http://imgur.com/5Lj00.png

Code

$args = array(
    'menu'      => 'Main menu',
    'container' => '',
    'menu_id'   => 'nav',
);
wp_nav_menu($args);

Lorsque vous visitez par exemple http://lichens.fr/view-lichens-by/lichens-by-habitat/ vous pouvez voir qu'il n'a pas de classe 'actuelle'. Aussi bien que c'est parent.

PS Désolé de poster "liens qui ne fonctionnent pas" - c'est à cause de la limitation de la réputation

Toutes les idées - aide très appréciée.

2
chodorowicz

Cela fait partie du code dans _wp_menu_item_classes_by_context() qui gère la classe en cours pour les pages:

// if the menu item corresponds to the currently-queried post or taxonomy object
} elseif (
    $menu_item->object_id == $queried_object_id &&
    (
        ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) ||
        ( 'post_type' == $menu_item->type && $wp_query->is_singular ) ||
        ( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) )
    )
) {
    $classes[] = 'current-menu-item';
  1. Les identifiants doivent correspondre.
  2. Il doit être de type post_type.
  3. La requête doit être pour is_singular.

Le deuxième point peut être exclu, car la classe CSS pour le type d'élément est générée correctement. Donc, quelque chose ne va pas avec les ID ou is_singular conditionnel.

Exécutez-vous des boucles secondaires sur la page? La raison la plus courante de rupture conditionnelle est l'utilisation incorrecte de query_posts().

5
Rarst

Je ne sais pas pourquoi cela ne fonctionne pas dans votre cas ... Comme vous le dites, la page active devrait recevoir "current_menu_item" ajoutée à ses classes. Si vous rencontrez des problèmes pour une raison ou une autre, vous pouvez toujours utiliser le filtre 'nav_menu_css_class' pour ajouter vos propres classes. Ce petit bout de code va essentiellement dupliquer les classes 'current_menu_item' & 'current_menu_parent' et ajouter une classe 'has_children' (utile pour les menus déroulants et extensibles):

function check_for_submenu($classes, $item) {
    global $wpdb, $post;
    if ($item->ID == $post->ID) array_Push($classes,'current_menu_item');
    $has_children = $wpdb->get_var("SELECT COUNT(meta_id) FROM wp_postmeta WHERE meta_key='_menu_item_menu_item_parent' AND meta_value='".$item->ID."'");
    if ($has_children > 0) {
        array_Push($classes,'has_children');
        $child_pages = $wpdb->get_col("SELECT c.meta_value FROM wp_postmeta AS c, wp_postmeta AS th 
                                      WHERE c.meta_key = '_menu_item_object_id' AND c.post_id = th.metavalue 
                                      AND th.meta_key= '_menu_item_menu_item_parent' AND th.post_id = {$item->ID}");
        if (in_array($post->ID,$child_pages)) array_Push($classes,'current_menu_parent');
    }
    return $classes;
}

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

Bien sûr, vous voulez comprendre pourquoi la fonctionnalité intégrée ne fonctionne pas pour vous avant de pirater quelque chose pour la dupliquer, mais vous pouvez faire beaucoup avec ce filtre si nécessaire ...

1
goldenapples