Begrenzen Sie Top-Level-Menüpunkte auf wp_nav_menu

Ich habe eine Situation, in der ich die Menüelemente der obersten Ebene in einem benutzerdefinierten Menü einschränken muss. Das Design hat nur Platz für 4 Elemente mit fester Breite, und ich möchte es zukünftig mehr anzeigen.

Betrachten Gibt es eine Möglichkeit, die Anzahl der Elemente auf oberster Ebene in einem benutzerdefinierten Menü zu begrenzen? , die Antwort bezieht sich auf wp_nav_menu_items .

Leider kann ich durch die wordpress.org-Foren und verschiedene Blogposts nur Beispiele sehen, die Elemente hinzufügen, und nichts, was sie entfernt.

Wenn ich $items , erhalte ich nur eine Liste von jedem Menüpunkt in seinem vollen HTML. Ich bin nicht gut genug mit Regex, um herauszufinden, wie man ein Limit einstellen kann, um nach 4 Punkten zu stoppen (und bin mir nicht sicher, ob das überhaupt mit Regex möglich ist).

Ich habe auch versucht, nur css zu verwenden, um alle verbleibenden Elemente durch overflow:hidden zu verbergen overflow:hidden , aber das verbirgt auch die Dropdowns, also ist das auch keine Option.

Gibt es eine Möglichkeit, Gegenstände der höchsten Ebene durch mein benutzerdefiniertes wp_nav_menu ?

Solutions Collecting From Web of "Begrenzen Sie Top-Level-Menüpunkte auf wp_nav_menu"

Ein paar Zeilen vor diesem Filter ist diese Zeile:

 $sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args ); 

Dieser Filter übergibt die walk_nav_menu_tree() der obersten Ebene, bevor walk_nav_menu_tree() aufgerufen wird.

Hier ist ein Testcode:

 add_filter( 'wp_nav_menu_objects', 'my_nav_menu_objects', 10, 2 ); function my_nav_menu_objects( $sorted_menu_items, $args ) { wp_die( '
' . var_export( $sorted_menu_items, true ) . '

' ); }

Es wurde auf einem 3-Punkte-Menü getestet. Zwei Top-Level-Elemente und 1 Untermenü.

Die getestete Seite hatte nur 1 Menü auf der Seite. Möglicherweise müssen Sie die Werte in $args testen, um das richtige Menü auf Ihrer Seite zu finden.

Wie erwartet, hat $sorted_menu_items 3 menu_item-Objekte zurückgegeben. Die 'menu_item_parent' obersten Ebene haben die Eigenschaft 'menu_item_parent' auf 0 gesetzt.

 'menu_item_parent' => '0', 

Sie können dies verwenden, um die Anzahl der Menüelemente auf oberster Ebene zu finden.

 add_filter( 'wp_nav_menu_objects', 'my_nav_menu_objects', 10, 2 ); function my_nav_menu_objects( $sorted_menu_items, $args ) { $top_level_menu_item_ids = array(); foreach ( $sorted_menu_items as $sorted_menu_item ) { if ( 0 == $sorted_menu_item->menu_item_parent ) $top_level_menu_item_ids[] = $sorted_menu_item->ID; } wp_die( '
' . var_export( count( $top_level_menu_item_ids ), true ) . '

' ); }

Dieser Code sollte die Seite unterbrechen und die Anzahl der Menüelemente auf oberster Ebene anzeigen.

Ich habe den Code nicht geschrieben, der benötigt wird, um die Anzahl der Elemente zu begrenzen, aber bedenken Sie, dass Sie alle untergeordneten Elemente entfernen müssen, wenn Sie einen übergeordneten Menüeintrag entfernen (deaktivieren).

Hier ist ein weiterer Test:

 function my_nav_menu_objects( $sorted_menu_items, $args ) { // Remove a menu item parent, but leave it's child menu item in place. unset( $sorted_menu_items[2] ); return $sorted_menu_items; } 

Das Ergebnis war, dass das Child-Menü wie ein Top-Level-Menü auf der Seite aussah.

Basierend auf der Antwort von Charles konnte ich den Code vervollständigen, um die oberen Menüpunkte zu begrenzen. Er erstellt einen Zähler für Menüelemente der obersten Ebene und setzt sie nach 4 wieder zurück. Anschließend speichert er diese ID, sodass weitere Elemente mit diesem Element als übergeordnetes Element entfernt werden können.

 /** * Limit number of nav menu items on primary menu */ function my_nav_menu_objects( $sorted_menu_items, $args ) { if ( $args->theme_location != 'primary' ) return $sorted_menu_items; $unset_top_level_menu_item_ids = array(); $array_unset_value = 1; $count = 1; foreach ( $sorted_menu_items as $sorted_menu_item ) { // unset top level menu items if over count 4 if ( 0 == $sorted_menu_item->menu_item_parent ) { if ( $count > 4 ) { unset( $sorted_menu_items[$array_unset_value] ); $unset_top_level_menu_item_ids[] = $sorted_menu_item->ID; } $count++; } // unset child menu items of unset top level menu items if ( in_array( $sorted_menu_item->menu_item_parent, $unset_top_level_menu_item_ids ) ) unset( $sorted_menu_items[$array_unset_value] ); $array_unset_value++; } return $sorted_menu_items; } add_filter( 'wp_nav_menu_objects', 'my_nav_menu_objects', 10, 2 );