it-swarm.com.de

Wie zeige ich ein Untermenü nur mit wp_nav_menu ()

Ich verwende diesen Code, um die Unterseiten des benutzerdefinierten Menüs anzuzeigen, wenn Sie sich auf der übergeordneten Seite befinden. Dieser Code zeigt jedoch auch eine übergeordnete Seite auf einer Seite ohne Untermenü, die ich gerne ausgeblendet hätte. Verwenden Sie diesen Code grundsätzlich nur, wenn wir uns auf einer Seite mit einer Unterseite befinden.

class Selective_Walker extends Walker_Nav_Menu
{
    function walk( $elements, $max_depth) {

        $args = array_slice(func_get_args(), 2);
        $output = '';

        if ($max_depth < -1) //invalid parameter
            return $output;

        if (empty($elements)) //nothing to walk
            return $output;

        $id_field = $this->db_fields['id'];
        $parent_field = $this->db_fields['parent'];

        // flat display
        if ( -1 == $max_depth ) {
            $empty_array = array();
            foreach ( $elements as $e )
                $this->display_element( $e, $empty_array, 1, 0, $args, $output );
            return $output;
        }

        /*
         * need to display in hierarchical order
         * separate elements into two buckets: top level and children elements
         * children_elements is two dimensional array, eg.
         * children_elements[10][] contains all sub-elements whose parent is 10.
         */
        $top_level_elements = array();
        $children_elements  = array();
        foreach ( $elements as $e) {
            if ( 0 == $e->$parent_field )
                $top_level_elements[] = $e;
            else
                $children_elements[ $e->$parent_field ][] = $e;
        }

        /*
         * when none of the elements is top level
         * assume the first one must be root of the sub elements
         */
        if ( empty($top_level_elements) ) {

            $first = array_slice( $elements, 0, 1 );
            $root = $first[0];

            $top_level_elements = array();
            $children_elements  = array();
            foreach ( $elements as $e) {
                if ( $root->$parent_field == $e->$parent_field )
                    $top_level_elements[] = $e;
                else
                    $children_elements[ $e->$parent_field ][] = $e;
            }
        }

        $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );  //added by continent7
        foreach ( $top_level_elements as $e ){  //changed by continent7
            // descend only on current tree
            $descend_test = array_intersect( $current_element_markers, $e->classes );
            if ( !empty( $descend_test ) ) 
                $this->display_element( $e, $children_elements, 2, 0, $args, $output );
        }

        /*
         * if we are displaying all levels, and remaining children_elements is not empty,
         * then we got orphans, which should be displayed regardless
         */
         /* removed by continent7
        if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
            $empty_array = array();
            foreach ( $children_elements as $orphans )
                foreach( $orphans as $op )
                    $this->display_element( $op, $empty_array, 1, 0, $args, $output );
         }
        */
         return $output;
    }
}

in der Vorlage mit:

wp_nav_menu( 
   array(
       'theme_location'=>'primary', 
       'walker'=>new Selective_Walker() 
   )
);
3
Nolan

In der Vergangenheit hatte ich genau das gleiche Problem mit Wordpress. In anderen CMS habe ich die Menüs immer mit einer Option für start_depth verwendet, wodurch es wirklich einfach war, ein sekundäres oder tertiäres Menü (geteiltes Menü) zu implementieren.

Wordpress enthält diese Funktion nicht. Viele der Online-Lösungen verwenden wp_list_pages, wobei die Menümanagerhierarchie vollständig ignoriert wird.

Nachdem ich verschiedene Walker und Widgets ausprobiert hatte, entschloss ich mich, einfach mein eigenes Plugin zu schreiben, das die Option start_depth enthält.

du verwendest es so:

wp_nav_menu(array('theme_location' => 'primary_navigation', 'start_depth' => 1));

für alle, die interessiert sind, können Sie es kostenlos im WordPress-Plugin-Repository herunterladen: https://wordpress.org/plugins/wp-nav-plus/

2
Matt Keys

Ich habe ein kostenloses Plugin erstellt, das dieses Problem löst!

https://wordpress.org/plugins/wp-nav-menu-extended/

Dieses Plugin erweitert die native Funktion wp_nav_menu und fügt zusätzliche Optionen hinzu:

  • level : (integer) (erforderlich, damit dieses Plugin funktioniert) Die Ebene des anzuzeigenden Navigationsmenüs. Wenn kein child_of-Parameter übergeben wird, werden alle Elemente dieser Ebene angezeigt
  • child_of : (string | integer) (optional) Entweder der Titel oder die Menüelement-ID des übergeordneten Elements im Menü, dessen direkte untergeordnete Elemente angezeigt werden sollen

Beispielnutzung:

$defaults = array( 'theme_location' => 'main_menu', 'level' => 2, 'child_of' => 'About Us', );

wp_nav_menu( $defaults );
2
Junaid Bhura