WordPress : Arguments ignorés/balisage modifié dans wp_nav_menu si aucun menu n’est sélectionné

Publié par Jean-Michel le

J’ai créé un menu en utilisant wp_nav_menu dans mon thème en utilisant la configuration la plus simple possible :

wp_nav_menu( array( 'theme_location' => 'my_theme_top_menu') );

Et dans mon functions.php :

register_nav_menus(
    array('my_theme_top_menu' => 'Top Menu' )
);

Cependant, je rencontre un comportement étrange lorsque l’utilisateur crée un menu dans wp-admin et l’attribue à ce menu. Lorsque vous sélectionnez le thème pour la première fois, il s’agit par défaut du menu par défaut construit à partir des pages, le balisage ressemble à ceci :

<div class="menu">
    <ul>
       <li class="page_item page-item-51">
           <a href="http://www.mdunham.co.uk/bligs/">About Us</a>

Mais, si un utilisateur sélectionne l’un de ses menus prédéfinis, le balisage qui construit le menu change complètement :

 <div class="menu-main-menu-container">
    <ul id="menu-main-menu" class="menu">
           <li id="menu-item-102" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-29 current_page_item menu-item-102">
               <a href="http://www.site.co.uk/">Home</a></li>

Pourquoi cela arrive-t-il? C’est comme lorsque vous utilisez un menu WP défini, le menu WP est défini par défaut (ou les paramètres que j’ai définis), mais lorsqu’il n’y a pas de menu défini et qu’il retombe, il utilise un ensemble d’options différent et bâtard que je n’ai défini nulle part moi-même .

Lire également:  Thème enfant Wordpress mettre en file d'attente javascript personnalisé

Solution n°1 trouvée

Voici l’utilisation par défaut dewp_nav_menu() :

<?php 
$defaults = array(
  'theme_location'  => ,
  'menu'            => , 
  'container'       => 'div', 
  'container_class' => 'menu-{menu slug}-container', 
  'container_id'    => ,
  'menu_class'      => 'menu', 
  'menu_id'         => ,
  'echo'            => true,
  'fallback_cb'     => 'wp_page_menu',
  'before'          => ,
  'after'           => ,
  'link_before'     => ,
  'link_after'      => ,
  'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
  'depth'           => 0,
  'walker'          => 
);
?>

Notez que la solution de repli par défaut pour wp_nav_menu()est wp_page_menu(), pour laquelle les valeurs par défaut sont :

<?php 
$args = array(
'sort_column' => 'menu_order, post_title',
'menu_class'  => 'menu',
'include'     => '',
'exclude'     => '',
'echo'        => true,
'show_home'   => false,
'link_before' => '',
'link_after'  => '' 
);
?>

Ceux-ci devraient produire principalement le même résultat, avec le même ensemble de pages. Cependant, si vous avez besoin d’un contrôle plus spécifique, vous avez plusieurs options :

  1. Attribuez un rappel personnalisé ici :

    ‘fallback_cb’ => ‘mytheme_wp_nav_menu_cb’

    …et ensuite, définissez :

      function mytheme_wp_nav_menu_cb() {
          // Output whatever menu you want here
      }
    

    …pour que vous annuliez wp_page_menu()

  2. Enveloppez votre wp_nav_menu()appel dans un has_nav_menu()conditionnel :

    if ( has_nav_menu( 'my_theme_top_menu' ) ) {
        // User has applied a custom menu
        // to the my_theme_top_menu location;
        // output it
        wp_nav_menu( array( 'theme_location' => 'my_theme_top_menu') );
    } else {
        // User has NOT applied a custom menu;
        // Do something else
    }
    

    … dans la elsedéclaration, vous pouvez faire n’importe quoi.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *