wp_nav_menu: afficher le menu uniquement s'il en existe un, sinon ne rien afficher

11

J'essaie d'utiliser wp_nav_menu pour afficher uniquement un menu s'il en existe un, sinon, n'afficher rien.

Si je supprime le menu, il affichera une liste des pages.

Mon fichier functions.php contient:

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

Comment puis-je utiliser wp_nav_menu pour afficher uniquement un menu s'il en existe un, sinon ne rien montrer?

Ryan
la source

Réponses:

19

Utilisez has_nav_menu()et testez theme_locationplutôt que 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' => '' 
    ) );
}
?>

Vous pouvez générer un contenu alternatif en ajoutant une elseclause.

ÉDITER

Vous devez remplacer $theme_locationpar votre réel 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
la source
Bien que cela génère rien s'il n'y a pas de menu, il ne malheureusement la même chose quand il est un menu. D'autres idées?
Ryan
Avez-vous appliqué un menu à l'emplacement de thème spécifié?
Chip Bennett
Non, comment je fais ça?
Ryan
1
Dashboard -> Appearance -> Menus. Créez et enregistrez un menu personnalisé, puis appliquez-le à l'emplacement de thème spécifié, à l'aide du menu déroulant.
Chip Bennett
Ah oui, je l'avais fait (capture d'écran: bit.ly/vrjNf9 ). Malheureusement, le problème persiste - le menu n'apparaîtra pas. PS Mon fichier de fonctions a ceci: if (function_exists ('register_nav_menus')) {register_nav_menus (array ('main_nav' => 'Main Navigation Menu')));}
Ryan
6

Vous pouvez simplement spécifier false comme fallback_cbargument de wp_nav_menu. Rien ne s'affichera - plutôt, wp_nav_menu retournera false (ne faisant aucun écho).

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

Vous pouvez simplement enregistrer le menu tout d'abord sans spécifier l'emplacement.
Dans functions.php:

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

Et lorsque vous appelez le menu header.php, vérifiez avec has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
Alex Chen
la source
Si vous enregistrez un menu sans emplacement de thème, vous ne pouvez pas le demander plus tard avec une restriction d'emplacement de thème.
fuxia
0

Lis ça:

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

set 'fallback_cb' => false et aucun ne sera affiché, c'est la méthode standard suggérée par les gars de wp.

Hooman Askari
la source
C'est la même chose que la réponse de chrisguitarguy ...
brasofilo
Je sais, je voulais juste vous signaler l'article principal sur le codex wordpress.
Hooman Askari
Il semble que ce ne soit pas vrai. La documentation dit: Si aucun paramètre theme_location ne lui est attribué, la fonction affiche developer.wordpress.org/reference/functions/wp_nav_menu/… le menu correspondant à l'ID, au slug ou au nom donné par le paramètre de menu; sinon, le premier menu non vide; sinon (ou si le menu donné par menu est vide), sortie de la fonction donnée par le paramètre fallback_cb (wp_page_menu (), par défaut); sinon rien.
Alireza