Benutzerdefiniertes Nav Walker-Menü – Zeigt die Anzahl der Kinder an

Ich habe ein benutzerdefiniertes Walker-Menü (siehe Code unten)

Ich möchte mein Navigationsmenü so haben

---------------------------------- Home | link1 | link2 | link3 (5) ---------------------------------- 

Wo 5 ist, zählen die Kinder link3.

Kann mir jemand helfen, das umzusetzen?

Hier ist mein aktueller benutzerdefinierter Nav-Walker-Code.

 <?php /** * Cleaner walker for wp_nav_menu() * * Walker_Nav_Menu (WordPress default) example output: * 
  • Home
  • *
  • Sample Page</l * * Roots_Nav_Walker example output: *
  • * */ class Roots_Nav_Walker extends Walker_Nav_Menu { function check_current($classes) { return preg_match('/(current[-_])|active|dropdown/', $classes); } function start_lvl(&$output, $depth = 0, $args = array()) { $output .= "\n

    Solutions Collecting From Web of "Benutzerdefiniertes Nav Walker-Menü – Zeigt die Anzahl der Kinder an"

    Ich habe @ array_map Antwort hinzugefügt, indem array_map und array_count_values . wenn das irgendjemand in der Zukunft hilft. Ich wollte keinen Zähler und keine foreach Schleife für etwas so Einfaches verwenden.

     function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { if ($item->hasChildren) { $locations = get_nav_menu_locations(); // Getting the locations of the nav menus array. $menu = wp_get_nav_menu_object( $locations['primary_navigation'] ); // Getting the menu calling the walker from the array. $menu_items = wp_get_nav_menu_items($menu->term_id); // Getting the menu item objects array from the menu. $menu_item_parents = array_map(function($o) { return $o->menu_item_parent; }, $menu_items); // Getting the parent ids by looping through the menu item objects array. This will give an array of parent ids and the number of their children. $children_count = array_count_values($menu_item_parents)[$item->ID]; // Get number of children menu item has. } } 
     function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) { $item_html = ''; parent::start_el($item_html, $item, $depth, $args); $locations = get_nav_menu_locations(); $menu = wp_get_nav_menu_object( $locations['primary_navigation'] ); $menu_items = wp_get_nav_menu_items($menu->term_id); $count = 0; foreach( $menu_items as $menu_item ){ if( $menu_item->menu_item_parent == $item->ID ){ $count++; } } if ($item->is_dropdown) { $item_html = str_replace('', ' '.$count.'', $item_html); } if ($item->is_dropdown && ($depth === 0)) { $item_html = str_replace('', ' ', $item_html); } elseif (stristr($item_html, 'li class="divider')) { $item_html = preg_replace('/]*>.*?< \/a>/iU', '', $item_html); } elseif (stristr($item_html, 'li class="nav-header')) { $item_html = preg_replace('/]*>(.*)< \/a>/iU', '$1', $item_html); } $output .= $item_html; } 

    Eine andere Option wäre, einen Blick darauf zu casting, was die Variable $item innerhalb der function start_el() beinhaltet.

    Zum Beispiel könnte die menu-order Eigenschaft für Sie von Nutzen sein.

     function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { echo $item->menu_order; } 

    Dies könnte etwas wie: 1234 ausgeben, wenn Sie vier Menüpunkte haben.

    Der sauberste Ansatz für diese Lösung wäre, die Anzahl der display_element aus der function display_element (wobei $this->has_children gesetzt ist) zu Walker_Nav_Menu die Walker_Nav_Menu aus der ursprünglichen Walker class (zusammen mit allen anderen Walker_X-classn) verwendet.

    Dies ermöglicht den Zugriff auf die Anzahl der Walker_Nav_Menu start_el in den erweiterten functionen von start_el , start_lvl , end_lvl , end_el und alle anderen functionen, die im Bereich display_element verschachtelt sind, indem $this->total_children wird. $this->total_children ersparen Sie sich den Code für all diese $this->total_children functionen (falls benötigt) und speichern Sie viele Server-Ressourcen mit großen Walker Strukturen, so …

     class Extended_Walker_Nav_Menu extends Walker_Nav_Menu { public $total_children; public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { if ( ! $element ) { return; } $id_field = $this->db_fields['id']; $id = $element->$id_field; $this->total_children = 0; if ( ! empty( $children_elements[ $id ] ) ) { $this->total_children = count( $children_elements[ $id ] ); } parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } }