it-swarm.com.de

Übergeordnetes Element der obersten Ebene mit Untermenü-Menüführung anzeigen

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

Es werden Menüelemente der zweiten oder unteren Ebene angezeigt, wenn die aktuelle Seite ein übergeordnetes Element, ein Geschwister oder ein Nachkomme der Seite ist.

Beispiel: Die Menühierarchie lautet:

  • ein
  • b
    • 1
      • ich
      • ii

Auf den Seiten B, 1, i oder ii wird 1, i und ii angezeigt. Ich möchte dazu das übergeordnete Element (B im Beispiel) hinzufügen, sodass auch das übergeordnete Element der obersten Ebene angezeigt wird.

Ich habe mich über Wanderer informiert, versucht, diesen Code zu verstehen, bin aber immer noch nicht sicher, 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.'<li'.$class_names.'>';

                $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 .= '<a'.$attributes.'>';
                $item_output .= $args->link_before.apply_filters('the_title', $item->title, $item->ID).$args->link_after;
                $item_output .= '</a>';
                $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 .= "</li>\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) == "<ul class=\"sub-menu\">\n") {
            $output = substr($output, 0, strlen($output) - 23);
        } else {
            $output .= "$indent</ul>\n";
        }
    }
}
3
mrwweb

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

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

das ist gleich:

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

da hast du $parent_item_id = 0.

Es sieht also so aus, als würde diese Bedingung Ihr übergeordnetes Element der obersten Ebene herausfiltern.

Möglicherweise möchten Sie diese Bedingung auch noch einmal überdenken:

&& $item->menu_item_parent != $parent_item_id

in der end_el() Methode.

1
birgire