Eliminar contenedor de wp_nav_menu no funciona

8 nov 2010, 16:47:12
Vistas: 46.4K
Votos: 15

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?

2
Comentarios

¿Qué quieres decir con si no uso un menú personalizado? ¿Podrías describir más claramente bajo qué condiciones obtienes el resultado deseado y cuándo no?

Rarst Rarst
8 nov 2010 22:33:48

Mi tema soporta menús personalizados. Si uso un menú personalizado, 'container'=>false funciona bien, pero si no, no funciona. Si uso 'container'=>'' ocurre lo mismo.

Oterox Oterox
9 nov 2010 17:29:11
Todas las respuestas a la pregunta 7
4
19

[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

26 abr 2011 01:28:10
Comentarios

Parece que no funciona en WordPress 3.9

tepkenvannkorn tepkenvannkorn
22 abr 2014 03:42:46

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))

Warface Warface
11 may 2014 03:40:44

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

enguerranws enguerranws
26 may 2020 11:12:44

... o no lo elimines, y en realidad tómate un minuto para crear una ubicación de menú.

squarecandy squarecandy
14 jul 2023 06:15:56
3

Encontré la solución.

Simplemente usa "ul" para 'container'

wp_nav_menu(array(
 'menu'=>'mainmenu' ,
 'container' => 'ul',
 'menu_class'=> '',
 'link_before'     => '<span>',
 'link_after'      => '</span>',
 'theme_location'  => 'primary')
 );
7 ene 2020 18:20:46
Comentarios

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

Krys Krys
5 oct 2020 17:21:22

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

Alexander Ivashchenko Alexander Ivashchenko
13 may 2021 15:41:36

esto me salvó la vida de un infierno, probé todos los tutoriales y ninguno funcionaba con las últimas versiones, esto funcionó exactamente como quería

Amir Rahman Amir Rahman
12 oct 2021 06:00:59
4
Prueba: <?php wp_nav_menu( array( 'container' => '' ) ); ?>

http://codex.wordpress.org/Function_Reference/wp_nav_menu

8 nov 2010 17:34:07
Comentarios

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

Rarst Rarst
8 nov 2010 22:34:52

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.

tw2113 tw2113
9 nov 2010 00:21:57

'container' => '' no funciona para mí. Estoy usando wp 3.0.1

Oterox Oterox
9 nov 2010 17:25:42

tampoco funciona para mí... con wp 3.2.1

papachan papachan
1 dic 2011 14:11:43
0

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...

23 dic 2010 17:05:26
1

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;
13 jun 2012 00:09:07
Comentarios

Esta es una mala idea ya que fallará si alguna vez hay cambios en el código que genera el núcleo.

squarecandy squarecandy
14 jul 2023 06:13:26
0

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 -->
14 jul 2023 06:12:13
0
-1

Prueba esto

<?php wp_nav_menu( array( 'menu' => 'Menú','link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
17 ene 2012 11:02:38