Ajouter la classe current_page_item pour les custom post types & pour les menus parents 4

Les custom post types c’est le bien dans WordPress, afin de pouvoir créer des pages personnalisées pour des clients, tout en gardant la possibilité de modifier facilement les contenus.

Le seul hic est que, par défaut, lorsque vous ajouterez votre post type à votre menu et que vous appellerez la fonction wp_nav_menu() pour l’afficher, lorsque vous serez dans un single-post-type, votre menu ne sera plus en évidence !

Voici un petit bout de code, à placer dans votre functions.php, qui permet de résoudre ce problème.

Il gère également le fait que lorsque vous êtes sur une page qui est un enfant dans le menu, le parent porte également la classe current_page_item.

Il est bien évidemment possible de définir des classes différentes que « current_page_item » en la modifiant dans le code 🙂

// Navigation active item
add_filter('nav_menu_css_class', 'nav_parent_class', 10, 2);

function nav_parent_class($classes, $item) {
    global $wpdb;
    $item_slug = get_page_by_title($item->title, OBJECT, 'page');
    $page = get_page(get_the_ID());
    // Custom Post Type
    if ((get_post_type() != "post" && get_post_type() != "page") && $page->post_type == $item_slug->post_name && !is_admin()) {
        $classes[] = 'current-menu-item current_page_item';
    } 
    // Sub-menu
    else if ($page->post_parent && $page->post_parent == $item_slug->ID) {
        $classes[] = 'current-menu-item current_page_item';
    }
    return $classes;
}
current-custom-post-type

Depuis la page single-post-type, mon menu post-type est automatiquement mis en évidence

current-parent

Depuis la page enfant « Plan », mon menu « Infos pratiques » est mis en évidence automatiquement

 

4 thoughts on “Ajouter la classe current_page_item pour les custom post types & pour les menus parents

  1. Reply Laurent Fév 21,2018 10:56

    Bonjour,
    Votre morceau de code m’intéresse beaucoup dans la mesure où les classes current-menu-item current_page_item sont utilisées dans mon thème WP (j’utilise Jkreativ), malheureusement j’obtiens une erreur sur la ligne 9 :
    « Trying to get property of non-object »…
    Même en ne gardant que le début de la ligne de test :
    (get_post_type() != "post" && get_post_type() != "page"), l’erreur est toujours là…
    Je sèche, si jamais vous avez une idée !

    • Reply Pierre Fév 21,2018 11:31

      Bonjour Laurent,

      C’est une bonne idée d’avoir testé en supprimant les 2 dernières conditions.
      Quand vous les supprimez, l’erreur devrait changer normalement. Si c’est bien le cas, pourriez-vous me dire ce qu’elle affiche ?

  2. Reply Laurent Fév 27,2018 10:33

    Bonjour Pierre, merci pour votre retour,

    Voici le comportement exact que j’observe aujourd’hui :

    – l’erreur ne survient que lorsque je suis dans une page interne d’un sous-menu, par exemple cette page (page accessible depuis livre album / exemple d’album) et le menu ne se construit pas

    – si je supprime la seconde partie du test if pour ne laisser que if get_post_type() != "post" && get_post_type() != "page", alors il n’y a plus d’erreur, mais tous les menus passent en gras (qui est l’indicateur de menu actif)…

    le code est dans le fichier functions.php du child theme Jkreativ, lequel fichier ne possède pas d’autre code…

  3. Reply Laurent Fév 27,2018 10:45

    Voici le message d’erreur complet :

    Notice: Trying to get property of non-object in /home/photosap/www/photographe-mariage-savoie/wp-content/themes/jkreativ-child/functions.php on line 9

    Je me demande si le pb ne vient pas du fait que la page en question (un article de custom post type portfolio) n’a pas d’entrée dans le menu (seulement son parent y est présent : les exemples d’albums…)

Leave a Reply