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

11

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

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

Mi archivo functions.php contiene:

if (function_exists('register_nav_menus')) {
register_nav_menus (
array('main_nav' => 'Main Navigation Menu'));}

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

Ryan
fuente

Respuestas:

19

Use has_nav_menu()y pruebe theme_location, en lugar de menu_id:

<?php
if ( has_nav_menu( $theme_location ) ) {
    // User has assigned menu to this location;
    // output it
    wp_nav_menu( array( 
        'theme_location' => $theme_location, 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>

Puede generar contenido alternativo agregando una elsecláusula.

EDITAR

Necesita reemplazar $theme_locationcon su actual theme_location :

<?php
if ( has_nav_menu( 'main_nav' ) ) {
    // User has assigned menu to this location;
    // output it
    wp_nav_menu( array( 
        'theme_location' => 'main_nav', 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>
Chip Bennett
fuente
Si bien esto da salida a nada si no hay menú, que por desgracia hace lo mismo cuando no es un menú. ¿Alguna otra idea?
Ryan
¿Ha aplicado un menú a la ubicación del tema especificado?
Chip Bennett
No, ¿cómo hago eso?
Ryan
1
Dashboard -> Appearance -> Menus. Cree y guarde un menú personalizado, luego aplíquelo a la Ubicación del tema especificada, utilizando el menú desplegable.
Chip Bennett
Ah sí, lo había hecho (captura de pantalla: bit.ly/vrjNf9 ). Desafortunadamente, el problema aún persiste: el menú no aparecerá. PD Mi archivo de funciones tiene esto: if (function_exists ('register_nav_menus')) {register_nav_menus (array ('main_nav' => 'Main Navigation Menu'));}
Ryan
6

Simplemente puede especificar falso como fallback_cbargumento de wp_nav_menu. No aparecerá nada, más bien, wp_nav_menu devolverá falso (sin hacer eco de nada).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));
chrisguitarguy
fuente
0

Simplemente puede registrar el menú en primer lugar sin especificar la ubicación.
En functions.php:

add_action( 'init', 'register_my_menus' );
function register_my_menus() {  
    register_nav_menus(
        array(
            'header' => __( 'Header Menu' )
        )
    );
}

Y cuando llame al menú header.php, consulte con has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
Alex Chen
fuente
Si registra un menú sin una ubicación de tema, no puede solicitarlo más tarde con una restricción de ubicación de tema.
fuxia
0

Lee esto:

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

set 'fallback_cb' => false y no se mostrará ninguno, este es el método estándar sugerido por wp guys.

Hooman Askari
fuente
Esto es lo mismo que la respuesta de Chrisguitarguy ...
brasofilo
Lo sé, solo quería señalar el artículo principal sobre el codex de WordPress.
Hooman Askari
Parece que no es cierto. Los documentos dicen: si no se le da un parámetro de ubicación_tema, la función muestra developer.wordpress.org/reference/functions/wp_nav_menu/… el menú que coincide con la ID, la babosa o el nombre dado por el parámetro de menú; de lo contrario, el primer menú no vacío; de lo contrario (o si el menú dado por el menú está vacío), salida de la función dada por el parámetro fallback_cb (wp_page_menu (), por defecto); de lo contrario nada.
Alireza