Cum să afișezi doar submeniul folosind wp_nav_menu()

19 iun. 2012, 11:07:20
Vizualizări: 31.6K
Voturi: 4

Folosesc acest cod pentru a afișa submeniul paginilor personalizate când te afli pe pagina părinte. Dar acest cod afișează și pagina părinte pe o pagină care nu are submeniu, lucru pe care aș dori să-l ascund. Practic, aș dori să folosesc acest cod doar dacă suntem pe o pagină care are subpagini.

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

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

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

        if (empty($elements)) //nu există elemente pentru parcurgere
            return $output;

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

        // afișare plată
        if ( -1 == $max_depth ) {
            $empty_array = array();
            foreach ( $elements as $e )
                $this->display_element( $e, $empty_array, 1, 0, $args, $output );
            return $output;
        }

        /*
         * trebuie să afișăm în ordine ierarhică
         * separăm elementele în două grupuri: elemente de nivel superior și elemente copil
         * children_elements este un array bidimensional, de ex.
         * children_elements[10][] conține toate sub-elementele al căror părinte este 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;
        }

        /*
         * când niciunul dintre elemente nu este de nivel superior
         * presupunem că primul trebuie să fie rădăcina sub-elementelor
         */
        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' );  //adăugat de continent7
        foreach ( $top_level_elements as $e ){  //modificat de continent7
            // coboară doar în arborele curent
            $descend_test = array_intersect( $current_element_markers, $e->classes );
            if ( !empty( $descend_test ) ) 
                $this->display_element( $e, $children_elements, 2, 0, $args, $output );
        }

        /*
         * dacă afișăm toate nivelurile și children_elements rămas nu este gol,
         * atunci avem orfani, care ar trebui afișați oricum
         */
         /* eliminat de 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;
    }
}

în șablon folosind:

wp_nav_menu( 
   array(
       'theme_location'=>'primary', 
       'walker'=>new Selective_Walker() 
   )
);
5
Comentarii

Este nevoie să fie o clasă Nav Menu Walker? Sau ar fi suficient să folosești wp_list_pages

Stephen Harris Stephen Harris
19 iun. 2012 12:21:35

De asemenea - ce se întâmplă dacă ești pe o pagină copil? Afișezi doar copiii acesteia (dacă există)? Sau copiii "părintelui" rădăcină?

Stephen Harris Stephen Harris
19 iun. 2012 12:22:34

Am încercat wp_list_pages, dar nu-mi afișa subpaginile, decât dacă subpaginile erau sub meniul principal Pages. În meniul meu personalizat am postări personalizate ca subpagin pentru meniuri derulante și acelea nu se afișau, acesta este singurul cod care a funcționat până acum...

Nolan Nolan
19 iun. 2012 14:08:48

Vreau doar părintele rădăcină al copiilor.

Nolan Nolan
19 iun. 2012 14:09:05

Am folosit soluția la această întrebare -> http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu/2809#2809

Adaugă un filtru pentru wp_nav_menu care permite să transmiți un parametru 'submenu'.

gdaniel gdaniel
12 nov. 2014 19:46:09
Toate răspunsurile la întrebare 2
0

Am întâmpinat aceeași problemă de multe ori în trecut cu WordPress. În alte CMS-uri pe care le-am folosit, meniurile aveau întotdeauna o opțiune pentru start_depth, ceea ce a făcut foarte ușor să implementez un meniu secundar sau terțiar (meniu divizat).

WordPress nu include această funcție; iar multe dintre soluțiile găsite online folosesc wp_list_pages, care ignoră complet ierarhia din managerul de meniuri.

După ce am încercat diferiți walkers și widget-uri, am decis în cele din urmă să scriu propriul meu plugin care are opțiunea start_depth încorporată.

Folosești astfel:

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

Pentru cei interesați, îl puteți obține gratuit din depozitul de plugin-uri WordPress: https://wordpress.org/plugins/wp-nav-plus/

14 mai 2013 04:25:30
0

Am creat un plugin gratuit care rezolvă această problemă!

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

Acest plugin extinde funcția wp_nav_menu din WordPress și adaugă opțiuni suplimentare:

  • level : (integer) (obligatoriu pentru funcționarea acestui plugin) Nivelul din meniul de navigație care trebuie afișat. Dacă nu este specificat parametrul child_of, vor fi afișate toate elementele de acest nivel
  • child_of : (string|integer) (opțional) Poate fi titlul sau ID-ul elementului părinte din meniu ale cărui elemente copil directe vor fi afișate

Exemplu de utilizare:

$defaults = array( 'theme_location' => 'main_menu', 'level' => 2, 'child_of' => 'Despre Noi', );

wp_nav_menu( $defaults );
24 feb. 2015 07:11:12