Come utilizzare wp_nav_menu per creare un menu a tendina select?

1 set 2011, 23:50:27
Visualizzazioni: 53.2K
Voti: 22

Sto utilizzando quanto segue all'interno della funzione wp_nav_menu per creare un menu a tendina select dove ogni voce del menu è un'opzione nel dropdown select...

'items_wrap' => '<select>%3$s</select>'
'before'     => '<option value="">'
'after'      => '</option>'

Come posso aggiungere il valore del link nella dichiarazione 'before'? Esiste un modo migliore per farlo? Conosco wp_dropdown_pages, ma non funziona perché voglio che gli utenti possano controllare il menu dalla pagina "Menu".

0
Tutte le risposte alla domanda 3
12
26

Non puoi farlo con wp_nav_menu, perché genera elementi di lista, e il tuo codice produrrà un markup non valido.

Prova invece a usare wp_get_nav_menu_items().


Una soluzione rapida per un menu a discesa con un walker personalizzato:

// Walker personalizzato per convertire il menu in un elemento <select>
class Walker_Nav_Menu_Dropdown extends Walker_Nav_Menu{

    // non genera il tag di apertura dei figli (<ul>)
    public function start_lvl(&$output, $depth){}

    // non genera il tag di chiusura dei figli    
    public function end_lvl(&$output, $depth){}

    public function start_el(&$output, $item, $depth, $args){
      // aggiunge spaziatura al titolo in base alla profondità corrente
      $item->title = str_repeat("&nbsp;", $depth * 4) . $item->title;

      // chiama il metodo originale e sostituisce il tag <li>
      // dal markup generato...
      parent::start_el(&$output, $item, $depth, $args);
      $output = str_replace('<li', '<option', $output);
    }

    // sostituisce il tag di chiusura </li> con il tag option di chiusura
    public function end_el(&$output, $item, $depth){
      $output .= "</option>\n";
    }
}

Nei tuoi template usalo in questo modo:

wp_nav_menu(array(
  'theme_location' => 'primary', // la tua posizione del tema qui
  'walker'         => new Walker_Nav_Menu_Dropdown(),
  'items_wrap'     => '<select>%3$s</select>',
));
1 set 2011 23:58:47
Commenti

In realtà, quando si utilizza la parte "items_wrap", questo rimuove gli elementi della lista, quindi il markup va bene. Darò comunque un'occhiata al link. Grazie!

Christopher John Christopher John
2 set 2011 00:01:17

sì, ma questo non gestisce i <UL> annidati :)

onetrickpony onetrickpony
2 set 2011 00:02:19

In realtà lo fa :-)

Christopher John Christopher John
2 set 2011 00:09:27

Secondo la fonte non lo fa, a meno che tu non stia usando un walker personalizzato...

onetrickpony onetrickpony
2 set 2011 00:21:06

Funziona oppure no?

chrisl-921fb74d chrisl-921fb74d
13 dic 2011 18:38:23

@OneTrickPony - come suggeriresti di implementare un pulsante di selezione con questo metodo?

Travis Northcutt Travis Northcutt
27 feb 2012 19:14:29

Non sono sicuro di cosa intendi con pulsante di selezione? Un link con un menu a discesa?

onetrickpony onetrickpony
28 feb 2012 18:48:49

Quello che intendo è che, usando questo codice, la select box appare ma non succede nulla quando si seleziona un elemento. Come implementeresti un pulsante che indirizzi l'utente alla pagina/voce di menu selezionata? Screenshot: http://f.cl.ly/items/3T3t250Y04031J2o2L1l/Image%202012-03-06%20at%201.30.03%20PM.png

Travis Northcutt Travis Northcutt
6 mar 2012 21:31:16

O con javascript, usando l'evento onchange, oppure racchiudilo in un form e aggiungi un pulsante di invio, gestendo tu il reindirizzamento durante l'elaborazione del form

onetrickpony onetrickpony
8 mar 2012 18:07:47

Funziona il walker?? Non mostra il menu a discesa con il tema predefinito

tamilsweet tamilsweet
16 giu 2012 15:13:38

Sì, funziona. Funziona al 24 Nov 2012. Copia e incolla la parte "wp_nav_menu(array( ..." nel tuo tema, dove vuoi che appaia il menu a discesa. NON lasciarlo nel file functions.php. Se lo fai, il menu a discesa apparirà quando functions.php viene chiamato e quindi potrebbe apparire in cima al contenuto effettivo, il che non è desiderabile. Quindi copia semplicemente la funzione nel file functions.php e copia wp_nav_menu dove vuoi che appaia, salva entrambi i file e ricarica la pagina. Dovrebbe funzionare. Sto usando la versione WP3+, quindi assicurati di aggiornare la tua versione di WP. Potrebbe NON funzionare sulle versioni più vecchie.

Devner Devner
24 nov 2012 18:26:23

Ho dovuto sostituire questo "parent::start_el($output, $item, $depth, $args);" con questo "parent::start_el(&$output, $item, $depth, $args);" per farlo funzionare.

dlopezgonzalez dlopezgonzalez
11 set 2014 15:11:34
Mostra i restanti 7 commenti
0

Ho trovato utile questo approccio:

Puoi seguire queste indicazioni per semplificare il codice CSS del menu a discesa.

  1. Aggiungi una classe parent agli elementi che hanno un sottomenu
  2. Aggiungi la classe depth (depth0, depth1, depth2...) per indicare la profondità

Aggiungi al file function.php del tuo tema:

class DD_Wolker_Menu extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
        $GLOBALS['dd_children'] = ( isset($children_elements[$element->ID]) )? 1:0;
        $GLOBALS['dd_depth'] = (int) $depth;
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }
}
add_filter('nav_menu_css_class','add_parent_css',10,2);
function  add_parent_css($classes, $item){
     global  $dd_depth, $dd_children;
     $classes[] = 'depth'.$dd_depth;
     if($dd_children)
         $classes[] = 'parent';
    return $classes;
}

Ora nel file header.php:

wp_nav_menu( array( 'container_class' => '','container' => '',  'menu' => 'header-menu', 'walker'=> new DD_Wolker_Menu ) );

Sostituisci header-menu con il nome del tuo menu

Un esempio di codice CSS potrebbe essere:

#menu-header-menu{
    margin: 0;
    padding: 0;
}
#menu-header-menu  ul{

}

#menu-header-menu> li{
    display: inline;
    margin-left: 1.618em;
}
#menu-header-menu  li{
    list-style: none;
}
#menu-header-menu  li a{
    text-decoration: none;
    font-size:  1em;
    font-family:    'Lato',Helvetica,Arial,sans-serif ;
    letter-spacing: 1px;
}
#menu-header-menu li.parent::after{
    content:'+';
}

#menu-header-menu  .sub-menu {
   display: none;
   position: absolute;
   background-color: #fff;
}

#menu-header-menu  li:hover>.sub-menu{
    display: inline;
    width: auto;
    height: auto;
    border: solid 1px #BBBBBB;
    z-index: +1;
}

Dove #menu-header-menu è l'ID della lista UL principale (devi aggiornarlo con il tuo ID)

3 mar 2016 21:47:15
0
-1

Il plugin Dropdown Menus risponde effettivamente alla domanda: wp_nav_menu non può essere utilizzato per creare un menu a tendina di tipo select, mentre il plugin fornisce un'utile funzione dropdown_menu() che svolge egregiamente il compito.

2 ago 2012 14:17:01