¿Cómo usar wp_nav_menu para crear un menú desplegable tipo select?
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".

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(" ", $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>',
));

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!

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

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

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

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

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

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

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.

He encontrado esto útil:
Puedes seguir estas respuestas para simplificar el código CSS de un menú desplegable.
- Añade una clase
parent
para los elementos que tienen un submenú - 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)

El plugin Dropdown Menus sí 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.
