Zeige Top-Level-Eltern mit Untermenü-Walker

Ich habe das Menü Walker unten verwendet, um dynamische Untermenüs mit großer Wirkung in der Vergangenheit anzuzeigen.

Wenn die aktuelle Seite ein Elternteil, ein Geschwister oder ein Nachkomme der Seite ist, werden Menüelemente der zweiten oder unteren Ebene angezeigt.

Zum Beispiel, wenn die Menühierarchie ist:

  • ein
  • b
    • 1
      • ich
      • ii

Es zeigt 1, i und ii, wenn auf den Seiten B, 1, i oder ii. Ich möchte das übergeordnete Element (B im Beispiel) dem übergeordneten Element hinzufügen, sodass auch das übergeordnete Element der obersten Ebene angezeigt wird.

Ich habe über Wanderer nachgelesen, versucht, diesen Code zu verstehen, bin aber immer noch fest, wo ich anfangen soll.

// Show only the child pages of a menu class child_menu_walker extends Walker_Nav_Menu { var $found_parents = array(); function start_el(&$output, $item, $depth, $args) { global $wp_query; if( $wp_query->is_single && !in_array( get_option('page_for_posts'), $this->found_parents ) ) { $this->found_parents[] = get_option('page_for_posts'); } //this only works for second level sub navigations $parent_item_id = 0; $indent = ($depth) ? str_repeat("\t", $depth) : ''; $class_names = ''; $classes = empty($item->classes) ? array() : (array) $item->classes; $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item)); $class_names = ' class="'.esc_attr($class_names).'"'; #current_page_item // Checks if the current element is in the current selection if( strpos($class_names, 'current-menu-item') || strpos($class_names, 'current-menu-parent') || strpos($class_names, 'current-menu-ancestor') || ( is_array($this->found_parents) && in_array($item->menu_item_parent, $this->found_parents) ) ) { // Keep track of all selected parents $this->found_parents[] = $item->ID; //check if the item_parent matches the current item_parent $item_output = ''; if ($item->menu_item_parent != $parent_item_id ) { $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); } } function end_el(&$output, $item, $depth) { $parent_item_id = 0; $class_names = ''; $classes = empty($item->classes) ? array() : (array) $item->classes; $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item)); $class_names = ' class="'.esc_attr($class_names).'"'; if( strpos($class_names, 'current-menu-item') || strpos($class_names, 'current-menu-parent') || strpos($class_names, 'current-menu-ancestor') || (is_array($this->found_parents) && in_array($item->menu_item_parent, $this->found_parents)) ) { // Closes only the opened li if (is_array($this->found_parents) && in_array($item->ID, $this->found_parents) && $item->menu_item_parent != $parent_item_id) { $output .= "
  • \n"; } } } function end_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); // If the sub-menu is empty, strip the opening tag, else closes it if (substr($output, -22) == "\n"; } } }

    Solutions Collecting From Web of "Zeige Top-Level-Eltern mit Untermenü-Walker"

    Sie können versuchen, die folgende if condition in der start_el() -Methode in Ihrer child_menu_walker class zu überspringen:

     if ($item->menu_item_parent != $parent_item_id ) { //... } 

    was gleich ist:

     if ($item->menu_item_parent != 0 ) { //... } 

    da du $parent_item_id = 0 .

    Es sieht also so aus, als ob diese Bedingung Ihren übergeordneten übergeordneten Benutzer ausfiltert .

    Sie können diese Bedingung auch noch einmal überdenken:

     && $item->menu_item_parent != $parent_item_id 

    in der Methode end_el() .