Come mostrare il sottomenu utilizzando solo wp_nav_menu()

19 giu 2012, 11:07:20
Visualizzazioni: 31.6K
Voti: 4

Sto usando questo codice per mostrare i sottomenu delle pagine personalizzate quando ci si trova nella pagina genitore. Tuttavia, questo codice mostra anche una pagina genitore in una pagina che non ha sottomenu, che vorrei nascondere. In pratica, vorrei utilizzare questo codice solo se ci troviamo in una pagina che ha sottopagine,

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

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

        if ($max_depth < -1) //parametro non valido
            return $output;

        if (empty($elements)) //niente da percorrere
            return $output;

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

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

        /*
         * necessario visualizzare in ordine gerarchico
         * separare gli elementi in due contenitori: elementi di primo livello ed elementi figli
         * children_elements è un array bidimensionale, es.
         * children_elements[10][] contiene tutti i sotto-elementi il cui genitore è 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;
        }

        /*
         * quando nessuno degli elementi è di primo livello
         * assumere che il primo deve essere la radice dei sotto-elementi
         */
        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' );  //aggiunto da continent7
        foreach ( $top_level_elements as $e ){  //modificato da continent7
            // scendere solo nell'albero corrente
            $descend_test = array_intersect( $current_element_markers, $e->classes );
            if ( !empty( $descend_test ) ) 
                $this->display_element( $e, $children_elements, 2, 0, $args, $output );
        }

        /*
         * se stiamo visualizzando tutti i livelli, e children_elements rimanenti non è vuoto,
         * allora abbiamo orfani, che dovrebbero essere visualizzati comunque
         */
         /* rimosso da 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;
    }
}

nel template usando:

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

Deve essere necessariamente una classe Nav Menu Walker? Oppure sarebbe sufficiente usare wp_list_pages

Stephen Harris Stephen Harris
19 giu 2012 12:21:35

Inoltre - cosa succede se sei su una pagina figlia? Mostri solo i suoi figli (se ne ha)? Oppure i figli del genitore 'root'?

Stephen Harris Stephen Harris
19 giu 2012 12:22:34

Ho provato con wp_list_pages, ma non mi mostrava le sottopagine, solo se le sottopagine erano sotto il menu effettivo delle Pagine. Nel mio menu personalizzato ho dei custom post type come sottopagine per i menu a discesa e quelli non venivano visualizzati, questo è l'unico codice che ho trovato funzionare finora...

Nolan Nolan
19 giu 2012 14:08:48

Voglio solo il genitore principale dei figli.

Nolan Nolan
19 giu 2012 14:09:05

Ho utilizzato la soluzione a questa domanda -> http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu/2809#2809

Aggiunge un filtro a wp_nav_menu che ti permette di passare un parametro 'submenu'.

gdaniel gdaniel
12 nov 2014 19:46:09
Tutte le risposte alla domanda 2
0

Ho avuto questo stesso problema molte volte in passato con WordPress. In altri CMS che ho utilizzato, i menu avevano sempre un'opzione per lo start_depth che rendeva molto semplice implementare un menu secondario o terziario (menu diviso).

WordPress non include questa funzione; e molte delle soluzioni trovate online utilizzano wp_list_pages che ignora completamente la gerarchia del gestore dei menu.

Dopo aver provato diversi walker e widget, ho finalmente deciso di scrivere il mio plugin che include l'opzione start_depth.

Si utilizza in questo modo:

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

Per chi fosse interessato, è disponibile gratuitamente sul repository dei plugin di WordPress: https://wordpress.org/plugins/wp-nav-plus/

14 mag 2013 04:25:30
0

Ho creato un plugin gratuito che risolve questo problema!

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

Questo plugin estende la funzione nativa wp_nav_menu e aggiunge opzioni aggiuntive:

  • level : (integer) (richiesto per il funzionamento del plugin) Il livello del menu di navigazione da mostrare. Se non viene passato il parametro child_of, mostra tutti gli elementi di questo livello
  • child_of : (string|integer) (opzionale) Il titolo o l'ID dell'elemento genitore nel menu di cui mostrare i figli diretti

Esempio di utilizzo:

$defaults = array( 'theme_location' => 'main_menu', 'level' => 2, 'child_of' => 'Chi Siamo', );

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