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?
Ryan
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
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
¿Puedes actualizar tu pregunta con el código de salida actual y real?
Chip Bennett
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
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
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
Alireza
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.
Hooman Askari
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