wp_nav_menu: mostrar menú solo si existe, de lo contrario no mostrar nada

2 nov 2011, 21:48:43
Vistas: 20.9K
Votos: 14

Estoy tratando de usar wp_nav_menu para mostrar un menú solo si existe, de lo contrario, no mostrar nada.

Si elimino el menú, mostrará una lista de las páginas.

Mi archivo functions.php contiene:

if (function_exists('register_nav_menus')) {
register_nav_menus (
array('main_nav' => 'Menú de Navegación Principal'));}

¿Cómo puedo usar wp_nav_menu para mostrar un menú solo si existe, de lo contrario no mostrar nada?

0
Todas las respuestas a la pregunta 4
9
24

Utiliza has_nav_menu() y verifica el theme_location, en lugar de menu_id:

<?php
if ( has_nav_menu( $theme_location ) ) {
    // El usuario ha asignado un menú a esta ubicación;
    // mostrarlo
    wp_nav_menu( array( 
        'theme_location' => $theme_location, 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>

Puedes mostrar contenido alternativo agregando una cláusula else.

EDITADO

Necesitas reemplazar $theme_location con tu verdadero theme_location:

<?php
if ( has_nav_menu( 'main_nav' ) ) {
    // El usuario ha asignado un menú a esta ubicación;
    // mostrarlo
    wp_nav_menu( array( 
        'theme_location' => 'main_nav', 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>
2 nov 2011 21:59:00
Comentarios

Si bien esto no muestra nada si no hay un menú, desafortunadamente hace lo mismo cuando sí hay un menú. ¿Alguna otra idea?

Ryan Ryan
2 nov 2011 23:23:03

¿Has asignado un menú a la Ubicación del Tema especificada?

Chip Bennett Chip Bennett
2 nov 2011 23:28:52

No, ¿cómo hago eso?

Ryan Ryan
2 nov 2011 23:32:57

Panel -> Apariencia -> Menús. Crea y guarda un menú personalizado, luego asígnalo a la Ubicación del Tema especificada, usando el menú desplegable.

Chip Bennett Chip Bennett
2 nov 2011 23:34:23

Ah sí, ya había hecho eso (captura de pantalla: http://bit.ly/vrjNf9). Desafortunadamente, el problema persiste - el menú no aparece. P.D. Mi archivo functions tiene esto: if (function_exists('register_nav_menus')) { register_nav_menus ( array('main_nav' => 'Menú de Navegación Principal'));}

Ryan Ryan
2 nov 2011 23:37:25

¿Puedes actualizar tu pregunta con el código de salida actual y real?

Chip Bennett Chip Bennett
2 nov 2011 23:40:22

Consulta la respuesta actualizada; en caso de que hayas tomado mi abreviatura de forma muy literal, aclaré los argumentos del array en la llamada a wp_nav_menu(). :)

Chip Bennett Chip Bennett
2 nov 2011 23:41:54

Actualicé la pregunta con tu código modificado, pero aún no muestra el menú (no está generando ningún HTML). ¿Hay algo más que pueda intentar?

Ryan Ryan
2 nov 2011 23:46:17

Debes usar tu Ubicación de Tema real, por ejemplo main_nav, no la variable de marcador de posición $theme_location. Consulta la respuesta actualizada.

Chip Bennett Chip Bennett
2 nov 2011 23:51:14
Mostrar los 4 comentarios restantes
2

Puedes simplemente especificar false como el argumento fallback_cb de wp_nav_menu. Nada aparecerá -- en su lugar, wp_nav_menu retornará false (sin imprimir nada).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));
3 nov 2011 00:06:56
Comentarios

¡Eso fue salvador! Ah, me estaba volviendo loco :)

Omid Ariyan Omid Ariyan
22 ene 2021 13:37:33
1

Puedes registrar el menú primero sin especificar la ubicación.
En functions.php:

add_action( 'init', 'register_my_menus' );
function register_my_menus() {  
    register_nav_menus(
        array(
            'header' => __( 'Menú de Cabecera' )
        )
    );
}

Y cuando llames al menú en header.php, verifica con has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
27 nov 2012 01:30:20
Comentarios

Si registras un menú sin una ubicación de tema, no podrás solicitarlo después con una restricción de ubicación de tema.

fuxia fuxia
27 nov 2012 06:33:40
3

Lee esto:

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

Establece 'fallback_cb' => false y no se mostrará nada, este es el método estándar sugerido por los desarrolladores de WordPress.

6 oct 2013 14:20:04
Comentarios

Esto es lo mismo que la respuesta de chrisguitarguy...

brasofilo brasofilo
6 oct 2013 16:02:47

Lo sé, solo quería señalarte el artículo principal en el codex de WordPress.

Hooman Askari Hooman Askari
10 oct 2013 17:34:51

Parece que no es cierto. La documentación dice:

Si no se proporciona un parámetro theme_location, la función muestra https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information el menú que coincida con el ID, slug o nombre dado por el parámetro menu; de lo contrario, el primer menú no vacío; de lo contrario (o si el menú dado por menu está vacío), la salida de la función dada por el parámetro fallback_cb (wp_page_menu(), por defecto); de lo contrario, nada.

Alireza Alireza
6 nov 2018 16:46:53