web-dev-qa-db-fra.com

wp_nav_menu revient toujours à un menu

salut à tous,
J'écris une fonction automatisée qui génère un menu à partir d'une fonction. il appelle wp_nav_menu sur chaque élément d'un tableau, car je veux que ce soit dynamique. le problème est, peu importe la façon dont je l'ai défini, si le menu n'existe pas, wp_nav_menu génère un menu, par exemple le 'default'. voici mon code (les éléments sont juste un ensemble de chaînes):

for($i=0;$i<count($items);$i++) {

    $themenu=$items[$i];

    $mymenu = wp_nav_menu(array(
            'menu' => $themenu,
            'menu_class' => 'mymenu',
            'container' => 'false',
            'fallback_cb' => 'false',
            'echo' => false
            )
        );  

    echo $themenu;

    }

je sais que cela fonctionne partiellement, car si $ themenu existe, il affiche le bon. mais si ce n'est pas le cas, il vous suffira d'afficher un menu! non seulement ennuyeux, mais brise également activement l'expérience utilisateur.

3
dama_do_bling

wp_nav_menu() essaie en effet beaucoup de vous fournir un menu, et fallback_cb n'est exécuté que lorsque rien d'autre ne fonctionne. À partir du code :

  • Si menu est fourni et fait référence à un menu existant (recherché via wp_get_nav_menu_object() , qui accepte un identifiant, un slug ou un nom), ce sera le menu.
  • Sinon, si theme_location est défini sur un emplacement de menu enregistré, il sera transmis à wp_get_nav_menu_object()
  • Sinon, WordPress recherchera le premier menu existant contenant des éléments et l'utilisera.
  • Sinon, fallback_cb est appelé, qui est par défaut wp_page_menu, qui est un menu de toutes les pages.

Donc, si vous souhaitez uniquement utiliser l'argument menu, vous devez le tester vous-même en appelant wp_get_nav_menu_object(). Si cela retourne quelque chose, appelez wp_nav_menu().

6
Jan Fabry

Essayez d’envelopper votre écho dans une condition has_nav_menu():

for($i=0;$i<size($items);$i++) {

    $themenu=$items[$i];

    $mymenu = wp_nav_menu(array(
            'menu' => $themenu,
            'menu_class' => 'mymenu',
            'container' => 'false',
            'fallback_cb' => 'false',
            'echo' => false
            )
        );  

    if ( has_nav_menu( $themenu ) ) echo $themenu;

    }

(Si je suis votre code correctement ...)

1
Chip Bennett

À partir de l'entrée Codex pour wp_nav_menu () :

$ fallback_cb (string) (optionnel) Si le menu n'existe pas, utilisez la fonction fallback.Défini sur false pour éviter tout repliement. Par défaut: wp_page_menu

Alors as-tu essayé de passer 'fallback_cb' => false?

MODIFIER:

Conformément au commentaire ci-dessous, 'fallback_cb' => 'false' indique à wp_nav_menu() de se replier sur une fonction appelée false() et, cette fonction étant inexistante, elle revient à sa fonction normale, wp_page_menu(). Donc, utilisez 'fallback_cb' => false (c'est-à-dire un boolean valeur, plutôt qu'un string valeur).

1
Chip Bennett