Eliminar contenedor de wp_nav_menu no funciona
Estoy convirtiendo este menú HTML a WordPress:
<ul>
<li><a href="/" class="current"><span>Inicio</span></a></li>
<li><a href="/"><span>Acerca de</span></a></li>
</ul>
Uso:
wp_nav_menu(array(
'menu'=>'mainmenu' ,
'container' => false,
'link_before' => '<span>',
'link_after' => '</span>',
'theme_location' => 'primary')
);
pero el HTML que obtengo es:
<div class="menu">
<ul>
<li class="current_page_item"><a href="http://localhost/goodsoil/" title="Inicio"><span>Inicio</span></a></li>
<li class="page_item page-item-2"><a href="http://localhost/goodsoil/?page_id=2" title="Acerca de"><span>Acerca de</span></a></li>
</ul>
</div>
Si uso un menú personalizado entonces obtengo:
<ul id="menu-test" class="menu">
<li id="menu-item-6" class="menu-item menu-item-type-custom current-menu-item current_page_item menu-item-home menu-item-6"><a href="url/"><span>Inicio</span></a></li>
<li id="menu-item-5" class="menu-item menu-item-type-post_type menu-item-5"><a href="url/?page_id=2"><span>Acerca de</span></a></li>
</ul>
pero si no uso un menú personalizado 'container'=>false no funciona. ¿Alguna solución?

[SOLUCIONADO] NO FUNCIONA cuando te refieres a una ubicación que no existe. Por ejemplo, cuando copiaste el código de otro lugar o aún no has creado tu menú o ubicación en el panel de control.
Por ejemplo, elimina ", 'theme_location' => 'primary'" del siguiente código:
wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel', 'theme_location' => 'primary' ) );
para que quede así:
wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel' ) );
Funciona perfectamente SIN el contenedor en mi sitio web SocialBlogsiteWebDesign.com

Primero crea tu menú en el administrador en apariencia->menús
y luego llama a wp_nav_menu(array('menu'=>'<nombre_del_menú>','container'=>false))

Bueno, ese es un comportamiento bastante extraño :/ Creo que este es un problema que debería ser reportado.

¡Creo que esto es exactamente lo que estoy buscando también, cómo eliminar el div innecesario de mi menú de navegación!

De alguna manera esta respuesta funciona pero no con una cadena vacía o false
. Gracias.

Prueba: <?php wp_nav_menu( array( 'container' => '' ) ); ?>

Se verifica como if ( $args->container )
en el código, por lo que false
o cadena vacía
no hacen diferencia.

Rarst, acabo de probarlo con un sitio en el que he estado trabajando recientemente, y establecer 'container' => '' realmente funcionó. Creo que no está probando el valor, sino más bien configurándolo como nulo y por lo tanto no muestra los datos.

te refieres a la función de respaldo (fallback) de los nav_menus. Esta es "wp_page_menu" y desafortunadamente no produce el mismo tipo de marcado que un menú personalizado.
Para solucionar esto, crea tu propio menú de respaldo. Yo uso este:
function my_page_menu($args){
$menu = '';
$args['echo'] = false;
$args['title_li'] = '';
// Si la página frontal es una página, añádela a la lista de exclusión
if (get_option('show_on_front') == 'page') $args['exclude'] = get_option('page_on_front');
$menu .= str_replace(array("\r", "\n", "\t"), '', wp_list_pages($args));
if($menu):
if($args['container']) $menu = '<'.$args['container'].' class="'.$args['container_class'].'">'.$menu;
$menu .= '<ul class="'.$args['menu_class'].'">'.$menu;
// añadir elemento de menú 'inicio'
$menu .= '<li class="home '.((is_front_page() && !is_paged()) ? 'current-menu-item' : null).'"><a href="'.home_url('/').'" title="'.__("Página de Inicio").'">'.$args['link_before'].__("Inicio").$args['link_after'].'</a></li>';
$menu .= '</ul>';
if($args['container']) $menu .= '</'.$args['container'].'>\n"';
$menu = apply_filters('wp_page_menu', $menu, $args);
endif;
echo $menu;
}
Puede que necesites modificarlo ya que mi tema maneja los menús a su manera, pero creo que entiendes la idea básica.
Y cuando llames a wp_nav_menu
hazlo así: wp_nav_menu(array('fallback_cb' => 'my_page_menu'));
También puedes hacer coincidir las clases con las de un menú personalizado usando esto:
add_filter('page_css_class', 'atom_page_css_classes', 420, 2);
function atom_page_css_classes($classes, $page){
// sobrescribir y usar el nombre (seguro) de la página en lugar del ID; nadie diseña por IDs...
$new_classes = array('page-'.$page->post_name);
// ajustar clases de menú activo para que coincidan con las añadidas por wp_nav_menu()
foreach($classes as $class)
if($class == 'current_page_item') $new_classes[] = 'current-menu-item';
elseif($class == 'current_page_parent') $new_classes[] = 'current-menu-parent';
elseif($class == 'current_page_ancestor') $new_classes[] = 'current-menu-ancestor';
return $new_classes;
}
De esta manera reduces algunas reglas CSS...

Desarrollé una solución simple y eficiente utilizando str_replace
, que puede aplicarse por separado para usar en tablas de menú en lugar de ul li
:
$menu = wp_nav_menu( array(
'theme_location' => 'main-menu',
'container_id' => 'mainMenu',
'container_class' => 'ddsmoothmenu',
'echo' => FALSE
));
$menu = str_replace(
array('ul id="main-menu" class="menu">','/ul>','li','/li>'),
array('table id="main-menu" class="menu">tr>','/tr>/table>','td','/td>'),
$menu
);
echo $menu;

TL;DR - usa
<?php
wp_nav_menu(
array(
// tu ID de menú, etc. va aquí
'items_wrap' => '%3$s', // elimina el <ul> por defecto
'container' => '', // elimina el <div> exterior
)
);
La estructura por defecto para wp_nav_menu
con los mínimos argumentos posibles será
<div class="menu-blahblah-container">
<ul id="blahblah">
<li class="menu-item">
<li class="menu-item">
<!-- etc -->
El parámetro items_wrap
por defecto es <ul id="%1$s" class="%2$s">%3$s</ul>
- así que hay algunas formas divertidas y fáciles de manipular cosas fuera de lo que se pregunta aquí. Pero si solo quieres eliminar completamente ese ul
, simplemente cámbialo a %3$s
, que básicamente significa "todo el contenido dentro del ul; nada del ul".
Así que ahora tenemos:
<div class="menu-blahblah-container">
<li class="menu-item">
<li class="menu-item">
<!-- etc -->
Te quedas con un montón de li
's, ¡lo cual es genial! Pero están atrapados dentro de un div
, lo cual no es genial si quieres usarlos junto con otros li
's personalizados en tu propio y bonito ul
casero.
Así que ahora añade el bit 'container' => ''
que otros han sugerido y estarás libre: ¡solo la parte de los elementos de lista del menú sin elementos contenedores!
<li class="menu-item">
<li class="menu-item">
<!-- etc -->
