it-swarm.dev

current-Menu-Item-Klasse für benutzerdefinierten übergeordneten Beitragstyp

Ich habe ein Problem mit meinem Menü und benutzerdefinierten Beitragstyp.

Ich habe einen benutzerdefinierten Beitragstyp "Dienste". Ich habe dafür eine neue Seite namens Services erstellt. Auf dieser Seite wird eine Liste aller Posts dieses benutzerdefinierten Post-Typs angezeigt. Die aktuelle Menüelementklasse funktioniert wie gewünscht.

Aber das Problem ist, wenn ich auf einen der Dienste klicke und zu mysite.com/services/service-1 gehe, verschwindet der aktuelle Menüpunkt auf der Seite "Dienste" im Menü. Ich muss zeigen, dass dieser aktuelle Beitrag ein untergeordnetes Element der Seite "Dienste" ist.

Alle Menüpunkte haben den gleichen HTML-Code:

<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>

Es gibt keine CSS-Klasse, mit der ich diesen Link als übergeordnetes Element formatieren könnte. Sowas wie aktuelles-Menü-Elternteil oder so. Wie könnte ich das beheben? Vielen Dank.

1

Normalerweise füge ich die folgenden übergeordneten Variablen, Filter und Methoden in meine Plugins ein, um diesen Fall zu berücksichtigen. Ich war mir nie sicher, ob dies die "richtige" Vorgehensweise ist, fühle mich aber besser, als es mit Javascript anzuwenden.

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;
    }
}

Laut Ihrer Anfrage nicht-Plugin-Route. Ich habe dies nicht auf Fehler getestet, sondern nur aus der obigen Klasse angepasst, aber es sollte dich zumindest in die richtige Richtung bringen:

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

Endgültiger Code:

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

Dieser Code fügt die Klasse 'current-menu-item' zum übergeordneten Menüpunkt Ihres untergeordneten CPT oder zur benutzerdefinierten Taxonomie oder zum Standardeinzelbeitrag hinzu, falls Sie keine verschachtelte Menüstruktur im Admin-Bereich haben - nur wenn Sie die Stufe 0 haben. Speisekarte. Beispiel: Wenn Sie über ein Seitenprodukt verfügen, in dem das Produktraster angezeigt wird und Sie zum einzelnen Produkt wechseln, wird der übergeordnete Menüeintrag WP nicht angezeigt. Der folgende Code verbessert dies:

function additional_active_item_classes( $classes = array(), $menu_item = false ) {
    // custom taxonomy
    if ( $menu_item->title == 'Custom Tax Name Page' && is_tax('custom_tax') ) {
        $classes[] = 'current-menu-item';
    }
    // custom post type single
    if ( $menu_item->title == 'Custom Post Type Page' && is_singular('products') ) {
        $classes[] = 'current-menu-item';
    }
    // blog post single
    if ( $menu_item->title == 'Blog Page' && is_singular('post') ) {
        $classes[] = 'current-menu-item';
    }
    return $classes;
}
add_filter( 'nav_menu_css_class', 'additional_active_item_classes', 10, 2 );
1
Marek

Normalerweise gibt es eine Klasse von .current-menu-Vorfahren, die den übergeordneten Elementen in der Navigation hinzugefügt werden.

Wenn dies nicht der Fall ist, schauen Sie sich diesen Beitrag an: Wie füge ich die 'current-menu-ancestor'-Klasse in ein benutzerdefiniertes Beitragstyp-Menü in Wordpress ein?

0
Joe