Elemente der obersten Ebene in einem benutzerdefinierten Menüassistenten zählen

Ich erstelle ein geteiltes Menü (die Hälfte der Elemente auf der linken Seite, das Logo in der Mitte, die restlichen Elemente auf der rechten Seite). Ich verstehe Walkers gar nicht so gut, aber ich habe dieses Code-Snippet gefunden .

Dies funktionierte gut für mich, bis mein Kunde untergeordnete Elemente hinzufügen wollte. Der aktuelle Code zählt alle Menüpunkte (10), wenn ich nur die Elemente der obersten Ebene zählen möchte (derzeit 7).

Wie stelle ich diesen Code so ein, dass nur die Elemente der obersten Ebene gezählt werden?

class Split_Menu_Walker extends Walker_Nav_Menu { var $current_menu = null; var $break_point = null; function start_el(&$output, $item, $depth, $args, $id=0) { global $wp_query; if( !isset( $this->current_menu ) ) $this->current_menu = wp_get_nav_menu_object( $args->menu ); if( !isset( $this->break_point ) ) $this->break_point = ceil( $this->current_menu->count / 2 ) + 1; $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = ' class="' . esc_attr( $class_names ) . '"'; $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args ); $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : ''; if( $this->break_point == $item->menu_order ) $output .= $indent . '
  • '; else $output .= $indent . '
  • '; $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 ) .'"' : ''; $item_output = $args->before; $item_output .= ''; $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after; $item_output .= ''; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } }

Solutions Collecting From Web of "Elemente der obersten Ebene in einem benutzerdefinierten Menüassistenten zählen"

Berechnung, von der du sprichst, hier zu sein:

 if( !isset( $this->break_point ) ) $this->break_point = ceil( $this->current_menu->count / 2 ) + 1; 

Sie können auf diese Weise keine Gegenstände der obersten Ebene erhalten. Stattdessen sollten Sie es selbst zählen. Sie können dies mit wp_get_nav_menu_items () tun. Für jedes Element der obersten Ebene sollte “menu_item_parent” auf “0” gesetzt sein.

Sie sollten eine zusätzliche Variable erstellen, in der Sie bereits angezeigte Elemente berechnen. Also sollte der Anfang Ihrer Datei so aussehen:

 class Split_Menu_Walker extends Walker_Nav_Menu { public $break_point = null; public $displayed = 0; function start_el(&$output, $item, $depth, $args, $id=0) { global $wp_query; if( !isset( $this->break_point ) ) { $menu_elements = wp_get_nav_menu_items( $args->menu ); $top_level_elements = 0; foreach( $menu_elements as $el ) { if( $el->menu_item_parent === '0' ) { $top_level_elements++; } } $this->break_point = ceil( $top_level_elements / 2 ) + 1; } $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; ... ... ... 

Dann solltest du $this->displayed++; jedes Mal, wenn Sie das Element der obersten Ebene anzeigen (zum Beispiel am Ende der function start_el ()):

 if( $item->menu_item_parent === '0' ) { $this->displayed++; } 

Endlich statt

 if( $this->break_point == $item->menu_order ) 

du solltest benutzen

 if( $this->break_point == $this->displayed )