¿Cómo elimino UL en wp_nav_menu?


18

Busqué en este sitio y encontré muchas respuestas para esta pregunta. La mayoría de ellos no está trabajando 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 se eliminará ulal principio y al final de wp_nav_menu(). Entonces en mi tema solo escribo

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

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

Pregunta:

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


Finalmente lo conseguí :) 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>

¿Por qué quieres eliminar el UL cuando lo agregas de nuevo? Puede usar los parámetros menu_classy menu_idpara establecer un atributo de clase y / o id en la UL.

Quiero usar superfish. menu_classy menu_idsolo funcionará si el menú está activado. Si el menú no existe menu_classy menu_idno es como <ul>sino como <div>. es por eso que muchas preguntas sobre wp_nav_menu()ti pueden probarlo :)
— jaja

Respuestas:


11

La función wp_nav_menu toma un argumento de fallback_cb, que es el nombre de la función que se ejecutará si el menú no existe. así que cambie su 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 puede eliminar el contenedor del menú y hacer otras cosas con algunos argumentos más enviados a la función wp_nav_menu

Espero que esto ayude.


@ בניית אתרים - Gracias por tu explicación. Pero me estoy poniendo borroso aquí. De acuerdo con la nota sobre nav-menu-template.php fallback_cb - If the menu doesn't exists, a callback function will fire. Defaults to 'wp_page_menu'. Set to false for no fallback¿Qué debo reemplazar para que wp_nav_menu_no_ul()funcione si configuro falso en el fallback_cb? Porque vuelve en blanco por ahora.
— jaja

Ahora entendido :) Muchas gracias בניית אתרים. Por cierto, ¿cómo pronuncio tu apodo? El míoha ha
— jaja

LOL, me alegra que lo hagas.
— Bainternet

Me he preguntado lo mismo, que es hebreo supongo, lo que sería una traducción exacta, por curiosidad .. :)
— t31os

:) sí, es hebreo y es un nick que aprendí un rato que si se traduce correctamente significa algo así como "diseño web".
— Bainternet

57

En realidad, WordPress admite esto de manera predeterminada:

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

El valor predeterminado para items_wrapes <ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>.


3
Esta es la respuesta correcta. Las otras respuestas de hacer una búsqueda y reemplazo programático para eliminar <ul>después de que ya se haya agregado son solo hacia atrás
— mikemike

'container' => falsesi quieres deshacerte del envoltorio <div>también.
— George Dimitriadis

Es verdaderamente configurable en WordPress por defecto. ¡Gracias!
— Abdalla Arbab

mejor respuesta, sin necesidad de truco
— Eman

esto no me funciona en wp 5.2
— rafaelphp


4

Si desea imprimir solo <a>etiquetas, puede ir 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>' );

este trabajo es perfecto para mí, configurar solo `` items_wrap '=>'% 3 $ s '' no tiene efecto en wp 5.2
— rafaelphp

2

Para mí lo que funcionó fue esto:

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

Espero eso ayude.


0

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

Al igual que antes de aplicar mi código, WordPress da estos tipos de salida en el menú

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

Pero alguien quiere cambiar ul en div y li en una etiqueta, entonces debe 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 da 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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.