web-dev-qa-db-fra.com

Ajout de la classe personnalisée "Elément de menu actuel" à la navigation?

J'utilise le code suivant pour forcer ma navigation dans wordpress à refléter la catégorie du message en cours.

Cela fonctionne parfaitement, mais j’ai besoin d’aide pour étendre cette fonction à plus qu’une catégorie et un élément de menu. J'ai essayé de dupliquer le code entier mais avec une catégorie et un élément de menu différents, mais wordpress génère une erreur "déjà déclarée" comme prévu.

Merci beaucoup pour toute aide ou conseil ..

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

function add_custom_class( $classes = array(), $menu_item = false ) {
    if ( is_single() && in_category( 'Services' ) && 1633 == $menu_item->ID && ! in_array( 'current-menu-item', $classes ) ) {
        $classes[] = 'current-menu-item';
    }
    return $classes;
}
1
speedypancake

Vous avez déclaré le même nom de fonction, c'est la cause de "l'erreur déclarée". Il suffit de changer la fonction de classe (y compris dans le crochet de filtre). Ou vous pouvez simplement étendre votre code de fonction. Je voudrais aussi réécrire la structure if pour une lisibilité plus facile:

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

function add_custom_class( $classes = array(), $menu_item = false ) {

    //Check if already have the class
    if (! in_array( 'current-menu-item', $classes ) ) {

        //Check if it's the ID we're looking for
        if ( 1633 == $menu_item->ID ) {

            //Check if is in a single post
            if ( is_single() ) {

                //Check if the single post is in the category
                if ( in_category( 'Services' ) ) {

                    $classes[] = 'current-menu-item';

                }

            }

        } elseif ( 1634 == $menu_item->ID ) {

            //Check if is in a single post
            if ( is_single() ) {

                //Check if the single post is in the category
                if ( in_category( 'Products' ) ) {

                    $classes[] = 'current-menu-item';

                }

            }

        }

    }

    return $classes;
}

De plus, ce code est presque non dynamique, car vous devez spécifier l'ID de menu et le nom de la catégorie. Si j'ai bien compris la logique de votre menu, vous essayez d'ajouter l'élément de menu en cours à un menu de catégorie, lorsqu'un seul article a cette catégorie. Je coderais quelque chose de similaire à: (pour que cela fonctionne avec n'importe quelle combinaison de catégories et de publications):

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

function add_custom_class( $classes = array(), $menu_item = false ) {

    //Check if already have the class
    if (! in_array( 'current-menu-item', $classes ) ) {

        //Check if it's a category
        if ( 'category' == $menu_item->object ) {

            //Check if the post is in the category
            if ( in_category( $menu_item->ID ) ) {

                $classes[] = 'current-menu-item';

            }

        }

    }

    return $classes;
}
3
Bruno Cantuaria