Überprüfen Sie, welcher “Typ” ein Menüelement ist

Die Frage

Ich möchte prüfen, welche Art von Menüeintrag für jeden Eintrag in meinem Menü ist, dh ob es sich um einen Seiten-, Kategorien- oder benutzerdefinierten Link handelt.

Was ich erreichen möchte

Ich möchte ein Menü erstellen, das aus Kategorien und Seiten besteht. Von den Kategorien im Menü möchte ich nur diejenigen anzeigen, die Beiträge enthalten. Seitenlinks werden immer angezeigt.

Dieses Menü wird auf einer E-Commerce-Site mit einem Katalog verwendet, der sich ständig ändert. Ein dynamisches Menü, das leere Kategorien verbirgt, macht das ständige Aktualisieren des Menüs im Admin-Bereich überflüssig.

Was ich jetzt habe

Ein benutzerdefiniertes Walker-Menü basierend auf diesem SE-Post, das erfolgreich Links zu leeren Kategorien verbirgt, indem Logik zur start_el function start_el wird. Leider verbirgt meine Logik auch Seitenlinks

Vollständige Walker-Menüfunktion:

 function cs_modify_nav_menu_args( $args ){ if( 'primary-menu' == $args['theme_location'] ){ $args['walker'] = new cs_walker_nav_menu(); } return $args; } class cs_walker_nav_menu extends Walker_Nav_Menu { // filter empty categories and add main/sub classes to li's and links function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { global $wp_query; if(!is_page($item->ID)){ $non_empty_categories = get_categories(array('taxonomy' => 'product_cat')); $empty_categories = array(); $is_empty = true; // check menu items are for an empty category foreach ( $non_empty_categories as $cat ) if ($item->object_id === $cat->term_id) $is_empty = false; // if it is empty add it to array if ($is_empty) $empty_categories[] = $item->ID; // Don't build nav item for items in the is_empty array foreach( $empty_categories as $category_to_skip ) if( $item->ID == $category_to_skip ) return $output; } $indent = ( $depth > 0 ? str_repeat( "\t", $depth ) : '' ); // code indent // depth dependent classes $depth_classes = array( ( $depth == 0 ? 'main-menu-item' : 'sub-menu-item' ), ( $depth >=2 ? 'sub-sub-menu-item' : '' ), ( $depth % 2 ? 'menu-item-odd' : 'menu-item-even' ), 'menu-item-depth-' . $depth ); $depth_class_names = esc_attr( implode( ' ', $depth_classes ) ); // passed classes $classes = empty( $item->classes ) ? array() : (array) $item->classes; $class_names = esc_attr( implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ) ); // build html $output .= $indent . '
  • ID . '" class="' . $depth_class_names . ' ' . $class_names . '">'; // link attributes $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : ''; $attributes .= ' class="menu-link ' . ( $depth > 0 ? 'sub-menu-link' : 'main-menu-link' ) . '"'; $item_output = sprintf( '%1$s%3$s%4$s%5$s%6$s', $args->before, $attributes, $args->link_before, apply_filters( 'the_title', $item->title, $item->ID ), $args->link_after, $args->after ); // build html $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } }
  • Versuchte Lösungen

    Das Objekt nav_menu_item liefert den nav_menu_item nicht.

    Die $item->ID an is_page wird nicht zurückgegeben. Ich glaube, $item->ID ist die Menü-ID, nicht eine Post-ID.

    Solutions Collecting From Web of "Überprüfen Sie, welcher “Typ” ein Menüelement ist"

    Glücklicherweise gibt es dafür eine einfache Lösung.

    Das $item im Walker liefert classn, und wenn es sich bei dem Menüelement um ein Archiv handelt, erhalten Sie eines davon:

    • menu-item-type-Taxonomie (allgemein)
    • menu-item-objekt-produkt_cat (product_cat == taxonomyname)

    ebenso gut wie

    • $ item-> type == ‘Taxonomie’
    • $ item-> object == ‘Ihre_Taxonomie’

    Wenn Sie möchten, dass diese Logik für verschiedene Archive funktioniert (nicht nur für product_cat ), müssen Sie auch die Taxonomie ändern – wiederum liefert $item Ihre $ Taxonomie als $item->object .

    Jetzt müssen Sie nur Ihre if und die Taxonomie in Ihrem Walker ändern

     if( $item->type == 'taxonomy' ) { $non_empty_categories = get_categories( array( 'taxonomy' => $item->object ) ); // ... The rest of your logic works fine } 

    Sollte gut funktionieren 🙂