¿Cómo eliminar UL en wp_nav_menu?

28 ene 2011, 10:32:27
Vistas: 54.1K
Votos: 23

Busqué en este sitio y encontré muchas respuestas para esta pregunta. La mayoría de ellas no funcionan en mi tema.

Aquí hay una solución que encontré y funciona según mis necesidades.

function wp_nav_menu_no_ul()
{
    $options = array(
        'echo' => false,
        'container' => false,
        'theme_location' => 'primary'
    );

    $menu = wp_nav_menu($options);
    echo preg_replace(array(
        '#^<ul[^>]*>#',
        '#</ul>$#'
    ), '', $menu);

}

Este código eliminará el ul al principio y al final de wp_nav_menu(). Así que en mi tema solo escribo

<ul class="primary-nav">
<?php  wp_nav_menu_no_ul(); ?>
</ul>

Pero el problema surge nuevamente cuando no agrego o activo ningún menú a través del admin. http://domain.com/wp-admin/nav-menus.php

Pregunta:

¿Cómo elimino el <div><ul>**</ul></div> independientemente de si el menú está activo o no? Háganmelo saber


¡Finalmente lo logré! :) functions.php

function wp_nav_menu_no_ul()
{
    $options = array(
        'echo' => false,
        'container' => false,
        'theme_location' => 'primary',
        'fallback_cb'=> 'default_page_menu'
    );

    $menu = wp_nav_menu($options);
    echo preg_replace(array(
        '#^<ul[^>]*>#',
        '#</ul>$#'
    ), '', $menu);

}

function default_page_menu() {
   wp_list_pages('title_li=');
} 

header.php

<ul class="primary-nav">
<?php  wp_nav_menu_no_ul(); ?>
</ul>
2
Comentarios

¿Por qué quieres eliminar el UL si de todas formas lo vas a agregar nuevamente? Puedes usar los parámetros menu_class y menu_id para establecer un atributo de clase y/o id en el UL.

User User
28 ene 2011 15:52:37

Quiero usar superfish. menu_class y menu_id solo funcionarán si el menú está activado. Si el menú no existe, menu_class y menu_id no se aplicarán como <ul> sino como <div>. Por eso hay tantas preguntas sobre wp_nav_menu(), puedes probarlo :)

haha haha
28 ene 2011 16:10:20
Todas las respuestas a la pregunta 7
7
80

De hecho, WordPress soporta esto por defecto:

wp_nav_menu(array(
    'items_wrap' => '%3$s'
));

El valor por defecto de items_wrap es <ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>.

7 dic 2011 17:37:47
Comentarios

Esta es la respuesta correcta. Las otras respuestas que sugieren hacer un buscar y reemplazar programático para eliminar <ul> después de que ya ha sido añadido son simplemente hacerlo al revés

mikemike mikemike
20 mar 2015 12:51:34

'container' => false si también quieres eliminar el <div> que lo envuelve.

George Dimitriadis George Dimitriadis
10 ago 2017 13:11:13

Es cierto que es configurable en WordPress por defecto. ¡Gracias!

Abdalla Arbab Abdalla Arbab
2 abr 2018 14:44:36

mejor respuesta, no se necesita hack

Eman Eman
2 feb 2019 04:58:03

esto no funciona para mí en wp 5.2

rafaelphp rafaelphp
30 jun 2019 19:48:34

Elijo esta como la mejor respuesta. (WP 5.7)

iamdual iamdual
18 mar 2021 13:37:05

Ten en cuenta que esto seguirá mostrando los elementos envueltos en <li>'s

kontur kontur
21 dic 2024 16:43:16
Mostrar los 2 comentarios restantes
6
11

La función wp_nav_menu toma un argumento llamado fallback_cb que es el nombre de la función a ejecutar si el menú no existe. Así que cambia tu código a algo como esto:

function wp_nav_menu_no_ul()
{
    $options = array(
        'echo' => false,
        'container' => false,
        'theme_location' => 'primary',
        'fallback_cb'=> 'fall_back_menu'
    );

    $menu = wp_nav_menu($options);
    echo preg_replace(array(
        '#^<ul[^>]*>#',
        '#</ul>$#'
    ), '', $menu);

}

function fall_back_menu(){
    return;
}

Incluso puedes eliminar el contenedor del menú y hacer otras cosas con algunos argumentos adicionales enviados a la función wp_nav_menu

Espero que esto ayude.

28 ene 2011 11:07:37
Comentarios

@בניית אתרים - Gracias por tu explicación. Pero me estoy confundiendo aquí. Según la nota en nav-menu-template.php fallback_cb - Si el menú no existe, se ejecutará una función de callback. Por defecto es 'wp_page_menu'. Establecer a false para no tener alternativa ¿Qué debería reemplazar para hacer que wp_nav_menu_no_ul() funcione si establezco false en fallback_cb? Porque actualmente devuelve en blanco.

haha haha
28 ene 2011 13:49:46

Ahora lo entendí :) Muchas gracias בניית אתרים. Por cierto, ¿cómo pronuncio tu apodo? El mío es ja ja

haha haha
28 ene 2011 14:08:00

LOL, me alegra que lo hayas entendido.

Bainternet Bainternet
28 ene 2011 14:17:27

Me he preguntado lo mismo, asumo que es hebreo, ¿cuál sería una traducción precisa? Por curiosidad.. :)

t31os t31os
28 ene 2011 17:55:33

:) sí, es hebreo y es un apodo que elegí hace tiempo que, si se traduce correctamente, significa algo como "diseño web".

Bainternet Bainternet
28 ene 2011 18:17:17

Por favor, mira la otra respuesta de Martti sobre esto. En lugar de agregar el <ul> y luego hacer un buscar y reemplazar para eliminarlo, simplemente no deberías agregarlo desde el principio. Hazlo usando la opción items_wrap

mikemike mikemike
20 mar 2015 12:52:33
Mostrar los 1 comentarios restantes
0

El siguiente código debería hacerlo simplemente.

<?php 

  $my_menu = array( 
  'menu' => 'main-menu', // Nombre del menú
  'container' => '', // Sin contenedor
  'items_wrap' => '%3$s' // Solo muestra los items del menú
  );

  wp_nav_menu( $my_menu ); // Mostrar el menú

?>

Consulta este enlace para la función wp_nav_menu http://codex.wordpress.org/Function_Reference/wp_nav_menu

14 may 2014 11:06:37
1

Si deseas imprimir solo etiquetas <a>, puedes hacerlo de esta manera:

$primaryMenu = array(
    'theme_location'  => 'primary',
    'menu'            => '',
    'container'       => '',
    'container_class' => false,
    'container_id'    => '',
    'menu_class'      => 'menu',
    'menu_id'         => 'primary-menu',
    'echo'            => false,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'depth'           => 0,
    'walker'          => ''
);
echo strip_tags( wp_nav_menu( $primaryMenu ), '<a>' );
17 nov 2015 09:02:21
Comentarios

esto funciona perfectamente para mí, configurando solo 'items_wrap' => '%3$s' no tiene efecto en wp 5.2

rafaelphp rafaelphp
30 jun 2019 19:50:39
0

Para mí lo que funcionó fue esto:

<?php wp_nav_menu( array(
       'container' => '',
       'items_wrap' => '%3$s' 
) ); ?>

Espero que te ayude.

5 abr 2014 23:58:36
0

Sé que esta respuesta no es completamente para esta pregunta, pero hay muchas personas que quieren saber cómo eliminar las etiquetas ul y li en WordPress y agregar otra etiqueta en WordPress.

Por ejemplo, antes de aplicar mi código, WordPress genera este tipo de salida en el menú:

<ul class="*****"><li>abc</li></ul>

Pero si alguien quiere cambiar ul por div y li por una etiqueta a, entonces debería usar el siguiente código:

<?php
    $menuParameters = array(
        'menu' => 'primary_menu',
        'link_before'     => '<span>',
        'link_after'      => '</span>',
        'before'        => '<div class="tp-primary-header mui-top-home">',
        'after'     => '</div>',
        'container'       => false,
        'echo'            => false,
        'depth'           => 0,
    );

    echo strip_tags(wp_nav_menu($menuParameters), '<a><span><div>');
?>

Esto genera una salida en el siguiente formato:

<div class="tp-primary-header mui-top-home"><a href="#"><span>ABC</span></a></div>
<div class="tp-primary-header mui-top-home"><a href="#"><span>def</span></a></div>
<div class="tp-primary-header mui-top-home"><a href="#"><span>XYZ</span></a></div>
28 dic 2019 22:41:42
0
<?php
$params = array(
    'theme_location' => 'ubicacion_menu', // Localización del tema
    'container' => false, // Sin contenedor
    'echo' => false, // No imprimir directamente
    'items_wrap' => '%3$s', // Envoltorio personalizado para los items
);

echo strip_tags(wp_nav_menu($params), '<a>'); // Mostrar menú conservando solo etiquetas <a>
?>
13 jul 2024 16:45:50