wp_nav_menu: mostrar menú solo si existe, de lo contrario no mostrar nada
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?
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' => ''
) );
}
?>

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

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

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'));}

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

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()
. :)

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?

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

Parece que no: https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information

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' ) );
}

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.

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

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.
