¿Cómo usar wp_nav_menu para crear un menú desplegable tipo select?

1 sept 2011, 23:50:27
Vistas: 53.2K
Votos: 22

Estoy usando lo siguiente dentro de la función wp_nav_menu para crear un menú desplegable select donde cada elemento del menú es una opción en el desplegable...

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

¿Cómo puedo agregar el valor del enlace en la declaración 'before'? ¿Hay una mejor manera de hacer esto? Conozco wp_dropdown_pages, pero eso no funciona porque quiero que los usuarios puedan controlar el menú desde la página "Menús".

0
Todas las respuestas a la pregunta 3
12
26

No puedes hacer esto con wp_nav_menu, porque genera elementos de lista, y tu código produciría un marcado inválido.

Intenta usar wp_get_nav_menu_items() en su lugar.


Una solución rápida para un menú desplegable con un walker personalizado:

class Walker_Nav_Menu_Dropdown extends Walker_Nav_Menu{

    // no genera la etiqueta de apertura de hijos (`<ul>`)
    public function start_lvl(&$output, $depth){}

    // no genera la etiqueta de cierre de hijos    
    public function end_lvl(&$output, $depth){}

    public function start_el(&$output, $item, $depth, $args){

      // añade espaciado al título según la profundidad actual
      $item->title = str_repeat("&nbsp;", $depth * 4) . $item->title;

      // llama al prototipo y reemplaza la etiqueta <li>
      // del marcado generado...
      parent::start_el(&$output, $item, $depth, $args);
      $output = str_replace('<li', '<option', $output);
    }

    // reemplaza el cierre </li> con la etiqueta option de cierre
    public function end_el(&$output, $item, $depth){
      $output .= "</option>\n";
    }
}

En tus plantillas, úsalo así:

wp_nav_menu(array(
  'theme_location' => 'primary', // tu ubicación de tema aquí
  'walker'         => new Walker_Nav_Menu_Dropdown(),
  'items_wrap'     => '<select>%3$s</select>',
));
1 sept 2011 23:58:47
Comentarios

De hecho, cuando se usa la parte "items_wrap", eso elimina los elementos de la lista, por lo que el marcado está bien. Sin embargo, revisaré el enlace. ¡Gracias!

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

sí, pero eso no maneja los <UL> anidados :)

onetrickpony onetrickpony
2 sept 2011 00:02:19

En realidad sí lo hace :-)

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

Según la fuente, no lo hace, a menos que estés usando un walker personalizado...

onetrickpony onetrickpony
2 sept 2011 00:21:06

¿Funciona esto o no?

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

@OneTrickPony - ¿cómo sugerirías implementar un botón de selección con este método?

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

¿No estás seguro de a qué te refieres con el botón de selección? ¿Un enlace con un menú desplegable?

onetrickpony onetrickpony
28 feb 2012 18:48:49

Lo que quiero decir es que, usando este código, el cuadro de selección aparece, pero no sucede nada cuando seleccionas un elemento. ¿Cómo implementarías un botón que envíe al usuario a la página/ítem del menú seleccionado? Captura de pantalla: 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

ya sea con javascript, usando el evento onchange, o envolverlo en un formulario y añadir un botón de envío, y manejar la redirección tú mismo durante el procesamiento del formulario

onetrickpony onetrickpony
8 mar 2012 18:07:47

¿Funciona el walker?? No muestra el cuadro desplegable con el tema predeterminado

tamilsweet tamilsweet
16 jun 2012 15:13:38

Sí, funciona. Funciona desde el 24 de noviembre de 2012. Copia y pega la parte "wp_nav_menu(array( ..." en tu tema, donde quieras que aparezca el menú desplegable. NO lo dejes en el archivo functions.php. Si lo haces, el menú desplegable aparecerá cuando se llame a functions.php y puede mostrarse en la parte superior del contenido real, lo cual no es deseable. Así que simplemente copia la función al archivo functions.php y copia wp_nav_menu donde quieras que aparezca, guarda ambos archivos y recarga la página. Eso debería funcionar. Estoy usando la versión WP3+, así que asegúrate de actualizar tu versión de WP. Puede que NO funcione en versiones anteriores.

Devner Devner
24 nov 2012 18:26:23

Tuve que reemplazar esto "parent::start_el($output, $item, $depth, $args);" por esto "parent::start_el(&$output, $item, $depth, $args);" para que funcionara.

dlopezgonzalez dlopezgonzalez
11 sept 2014 15:11:34
Mostrar los 7 comentarios restantes
0

He encontrado esto útil:

Puedes seguir estas respuestas para simplificar el código CSS de un menú desplegable.

  1. Añade una clase parent para los elementos que tienen un submenú
  2. Añade una clase depth (depth0, depth1, depth2...)

Añade a function.php de tu 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;
}

Ahora en header.php:

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

header-menu reemplázalo por el nombre de tu menú

Un ejemplo de código CSS podría ser:

#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;
}

Donde #menu-header-menu es el ID de la lista UL principal (necesitarás actualizarlo también)

3 mar 2016 21:47:15
0
-1

El plugin Dropdown Menus responde a la pregunta: wp_nav_menu no se puede usar para crear menús desplegables tipo select, mientras que el plugin proporciona una práctica función dropdown_menu() que realiza esta tarea de manera admirable.

2 ago 2012 14:17:01