web-dev-qa-db-fra.com

classe d'items de menu en cours pour un parent de type publication personnalisé

J'ai un problème avec mon menu et mon type de message personnalisé.

J'ai un type de poste personnalisé de "services". J'ai créé une nouvelle page pour cela appelée Services. Sur cette page, je suis en train d'afficher une liste de toutes les publications de ce type de publication personnalisée. La classe item-menu-item fonctionne comme prévu.

Mais le problème, c’est que lorsque je clique sur l’un des services et que je vais sur mysite.com/services/service-1, l’élément de menu actuel de la page de services du menu disparaît. Je dois montrer que ce poste actuel est un enfant de la page Services.

Tous les éléments de menu ont le même code HTML:

<li id="menu-item-23" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23"><a href="http://localhost/wordpress/sluzby/">Služby</a></li>

Il n'y a pas de classe CSS que je pourrais utiliser pour définir ce lien en tant que parent. Quelque chose comme parent actuel ou quelque chose. Comment pourrais-je résoudre ce problème? Merci.

1

J'inclus généralement la variable parent, le filtre et la méthode suivants dans mes plugins pour prendre en compte ce cas. Je n'ai jamais été sûr que ce soit la "bonne" façon de procéder, mais je me sens mieux que de l'appliquer en javascript.

class Plugin_Name {
    private $parent = 'services'; // ideally this is a setting in your plugin, not a hard-coded variable in case the page slug changes

    function __construct() {
        // Add classes to 'parent'
        add_filter( 'nav_menu_css_class', array( &$this, 'nav_parent_class' ), 10, 2 );
    }

    function nav_parent_class( $classes, $item ) {

        if ( $this->nicename == get_post_type() && ! is_admin() ) {
            global $wpdb;

            // remove any active classes from nav (blog is usually gets the currept_page_parent class on cpt single pages/posts)
            $classes = array_filter($classes, ($class == 'current_page_item' || $class == 'current_page_parent' || $class == 'current_page_ancestor'  || $class == 'current-menu-item' ? false : true ));

            // get page info
            // - we really just want the post_name so it cane be compared to the post type slug
            $page = get_page_by_title( $item->title, OBJECT, 'page' );

            // check if slug matches post_name
            if( $page->post_name == $this->parent ) {
                $classes[] = 'current_page_parent';
            }

        }

        return $classes;
    }
}

Par votre demande, route non-plugin. Je n'ai pas testé cela pour les erreurs, juste adapté de la classe ci-dessus mais cela devrait au moins vous mettre dans la bonne direction:

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

function nav_parent_class( $classes, $item ) {
    $cpt_name = 'service';
    $parent_slug = 'services';

    if ( $cpt_name == get_post_type() && ! is_admin() ) {
        global $wpdb;

        // remove any active classes from nav (blog is usually gets the currept_page_parent class on cpt single pages/posts)
        $classes = array_filter($classes, ($class == 'current_page_item' || $class == 'current_page_parent' || $class == 'current_page_ancestor'  || $class == 'current-menu-item' ? false : true ));

        // get page info
        // - we really just want the post_name so it cane be compared to the post type slug
        $page = get_page_by_title( $item->title, OBJECT, 'page' );

        // check if slug matches post_name
        if( $page->post_name == $parent_slug ) {
            $classes[] = 'current_page_parent';
        }

    }

    return $classes;
}
5
Joey Yax

Code final:

function nav_parent_class($classes, $item) {
    $cpt_name = 'services';
    $parent_slug = 'sluzby';

    if ($cpt_name == get_post_type() && !is_admin()) {
        global $wpdb;

        // get page info (we really just want the post_name so it can be compared to the post type slug)
        $page = get_page_by_title($item->title, OBJECT, 'page');

        // check if slug matches post_name
        if( $page->post_name == $parent_slug ) {
            $classes[] = 'current_page_parent';
        }

    }

    return $classes;
}

add_filter('nav_menu_css_class', 'nav_parent_class', 10, 2);
1

Normalement, une classe de .current-menu-ancor est ajoutée aux éléments parents dans la navigation.

Si ce n'est pas le cas, jetez un coup d'œil à cet article: Comment inclure la classe 'current-menu-ancestor' dans un menu de type message personnalisé dans Wordpress?

0
Joe