web-dev-qa-db-fra.com

Supprimer la classe de navigation current_page_parent de l'index du blog en mode CPT

J'essaie de supprimer la classe current_page_parent de l'élément de menu d'index de blog (une page personnalisée affichant toutes les publications de blog figure dans le menu) lors de la navigation dans la page d'archive de type publication personnalisée et dans les publications de type publication personnalisée.

J'ai trouvé des questions similaires mais je ne vois pas comment résoudre ce problème. De plus, je n'ai pas le current_page_parent lorsque je navigue dans le custom_post_type (je suppose que c'est lié).

3
Kevin Mamaqi

Vous pouvez utiliser le filtre nav_menu_css_class pour ajouter ou supprimer des classes dans les éléments de menu. Ce filtre est appliqué à chaque élément de menu. Un tableau de classes et l'objet d'élément de menu seront transmis à la fonction, et vous aurez return un tableau des classes que vous souhaitez que l'élément de menu ait.

Les PHP array_diff peuvent être utilisés pour supprimer des classes. Il est également possible d'ajouter des éléments en ajoutant des noms de classes au tableau via $classes[] = 'some-class-name'. Vous pouvez utiliser le Conditional Tags pour vérifier quel type de page est actuellement affiché afin de déterminer ce que vous devez ajouter ou supprimer.

Voici un exemple rapide qui vérifie si la page en cours de visualisation est une archive ou une publication du type your-post-type et si le nom de l'élément de menu est Blog. Si ces conditions sont remplies, la classe current_page_parent est supprimée du tableau de classes pour cet élément de menu. Vous pouvez ajouter ou modifier ceci pour vos besoins.

function wpdev_nav_classes( $classes, $item ) {
    if( ( is_post_type_archive( 'your-post-type' ) || is_singular( 'your-post-type' ) )
        && $item->title == 'Blog' ){
        $classes = array_diff( $classes, array( 'current_page_parent' ) );
    }
    return $classes;
}
add_filter( 'nav_menu_css_class', 'wpdev_nav_classes', 10, 2 );
9
Milo

La réponse actuelle est excellente, mais cela suppose que le titre de l'élément de navigation du blog est "Blog". Cela pourrait poser problème si un utilisateur modifiait jamais l'élément de navigation dans WordPress. Le code suivant est universel puisqu'il compare l'identifiant de page de l'élément de navigation à l'identifiant de page du blog stocké dans les options de WordPress.

function my_custom_post_type_nav_classes( $classes, $item ) {
    $custom_post_type = 'custom-post-type';
        if( ( is_post_type_archive( $custom_post_type) || is_singular( $custom_post_type ) )
        && get_post_meta( $item->ID, '_menu_item_object_id', true ) == get_option( 'page_for_posts' ) ){
            $classes = array_diff( $classes, array( 'current_page_parent' ) );
        }
        return $classes;
    }
    add_filter( 'nav_menu_css_class', 'my_custom_post_type_nav_classes', 10, 2 );
2
richk