Depuis WordPress 3.0, il n’a jamais été aussi facile de créer et modifier des menus de navigation.
Cette fonctionnalité n’en reste pas moins compliquée à utiliser si votre thème ne prend pas en charge les emplacements de menus.
Dans ce tutoriel, nous verrons comment définir un emplacement de menu de navigation personnalisé.
Autrement dit, il vous sera possible d’indiquer directement depuis Apparence > Menus où chaque menu devra s’afficher, en sélectionnant l’un des emplacements que nous aurons déclarés. Cette méthode concerne les thèmes classiques ; avec un thème à blocs, rendez-vous à la dernière partie.
Étape n°1 – Modification du fichier functions.php
N.B : vérifiez d’abord que votre thème ne déclare pas déjà ses propres emplacements. Ils sont listés dans Apparence > Menus, onglet Gérer les emplacements, visible dès que vous avez créé un menu. S’ils vous suffisent, passez directement à l’étape n°3 ; si vous en ajoutez, choisissez des identifiants différents des leurs.
Comme souvent, il nous faut éditer le fichier functions.php présent dans le dossier /wp-content/themes/NOM_DU_THEME/functions.php accessible via un client FTP.
Pour ne pas perdre vos modifications à la prochaine mise à jour du thème, travaillez de préférence dans un thème enfant : son fichier functions.php se charge en plus de celui du thème parent.
Vous pouvez également passer par Apparence > Éditeur de fichiers des thèmes.
En fin de fichier, ajoutez les lignes de code suivantes :
Ce bout de code aura pour effet de créer 2 emplacements de menu pour votre thème, identifiés par primary et footer, et d’activer la prise en charge des menus : si votre thème ne la déclarait pas, le sous-menu Menus apparaît alors dans Apparence.
Main menu et Footer menu sont les libellés de ces emplacements dans l’administration. Ils passent par la fonction de traduction __() : remplacez le domaine wpchannel par celui de votre thème, ou saisissez directement des libellés en français.
Étape n°2 – Modification de votre thème WordPress
Évidemment, cette technique présuppose d’avoir inséré dans votre thème la fonction qui va afficher le menu en question, wp_nav_menu() :
Cette commande va donc afficher le menu affecté à l’emplacement primary, que vous pouvez créer et modifier depuis l’administration de WordPress, dans une balise nav dotée d’un libellé destiné aux lecteurs d’écran. À insérer généralement dans le fichier header.php, là où le menu doit apparaître (avec un thème enfant, copiez d’abord ce fichier depuis le thème parent). Pour l’emplacement footer, procédez de même dans footer.php avec 'theme_location' => 'footer'.
Tant qu’aucun menu n’est affecté à l’emplacement, WordPress affiche à sa place la liste de vos pages : ajoutez 'fallback_cb' => false au tableau d’arguments pour ne rien afficher dans ce cas. Les autres paramètres de la fonction sont détaillés dans le tutoriel sur les menus personnalisés cité en introduction.
Étape n°3 – Choix de l’emplacement des menus
Retournez ensuite dans Apparence > Menus et créez votre menu si ce n’est pas déjà fait. En bas de l’onglet Modifier les menus, la section Réglages du menu liste désormais vos emplacements sous Emplacement du menu : cochez celui où afficher le menu, puis cliquez sur Enregistrer le menu.
Dans notre exemple, ce sont donc les libellés « Main menu » et « Footer menu » qui s’affichent : WordPress ne les traduit que si votre thème fournit une traduction pour son domaine.
L’onglet Gérer les emplacements, en haut de l’écran, permet aussi d’affecter tous vos menus d’un coup : choisissez un menu dans la liste déroulante de chaque emplacement, puis cliquez sur Enregistrer les modifications.
Et avec un thème à blocs ?
Avec un thème à blocs, comme Twenty Twenty-Five, le thème par défaut de WordPress, cette méthode ne s’applique pas : pas de fichier header.php à modifier, ni d’emplacements de menus. Le menu est un bloc Navigation, placé dans l’en-tête du thème, auquel vous associez directement le menu de votre choix depuis Apparence > Éditeur. Je détaille cette méthode dans la dernière partie du tutoriel pour créer des menus personnalisés avec WordPress.
Déclarer des emplacements avec register_nav_menus() dans un thème à blocs fait certes apparaître Apparence > Menus, mais c’est dans le bloc Navigation lui-même que vous choisissez le menu affiché. Seule exception : tant qu’aucun menu de navigation n’existe, WordPress crée le premier à partir du menu affecté à l’emplacement primary, s’il y en a un. Et si vous passez d’un thème classique à un thème à blocs, vos menus ne sont pas perdus : le bloc Navigation peut les importer.
Vous êtes désormais capable de définir des emplacements de menus de navigation dans votre thème WordPress. Pratique, non ?
Une fois vos menus en place, vous pouvez ajouter des icônes à vos éléments de menu.
Merci ! Cela m’a bien aidé.
Bonjour et merci pour votre article
j’ai un soucis avec mon menu…
Sur mon blog, j’ai un menu « Ubermenu » personnalisé.
Aujourd’hui je change de thème et le menu du nouveau thème prends le pas sur mon menu Ubermenu.
Je ne sais pas si je suis clair…
Je ne sais pas comment afficher mon ancien menu Ubermenu correctement…
Pensez-vous pouvoir m’aider ?
Merci
Bonjour Julie, est-il possible que le menu ne soit plus assigné au bon emplacement ?
Merci pour ta réponse. C’était effectivement ça 😉
Bonjour,
Je suis fan de vos articles merci beaucoup ça m’a beaucoup aidé.
Voilà je suis novice et je travail sur le démo de thème aszok.
J’ai supprimer et remplacé les menus puis rajouter des sous menus.
Mon problème c’est que je souhaite intégrer les produits dans les » SOUS MENUS ».
Exemple : menu principal » ÉLÉGANCE » sous menus pages » ROBES, TOPS, JUPES… ». (
JE n’arrive pas à intégrer les produits dans les sous menus. Il s’affiche ailleurs mais pas dans les sous menus.
Pourriez-vous m’aider svp comment intégrer un produit robe dans le « sous menu » ROBES ou faire un liendes produits sous l’onglet » sous menu » ROBRS ». Je ne sais plus quoi faire
Marie
MERCI DE VOTRE AIDE
Je dois être une quiche mais cela ne m’a pas permis de faire un menu de pied de page. Dommage.
J’ai déjà un menu existant et je voudrais ajouter un second menu mais je n’y arrive pas du tout, la solution est-elle différente pour un seconde menu ?
Il faut créer un second emplacement puis ensuite afficher le menu dans le bon fichier PHP du thème. On peut créer autant d’emplacements et de menus que nécessaire.
Bonsoir !
Merci pour le tuto, il m’a beaucoup aidé pour créer un menu spécifique pour la page des posts en utilisant » is_archive « .
J’ai aussi ajouté une classe » active » pour ce menu.
C’est compatible jusqu’à WordPress 3.9.2
Voici les scripts :
– « is archive » :
‘secondary’, /* identifiant du menu pour WP */
‘container’ => ‘ul’, ‘container_class’ => ‘css-menu’, ‘menu_class’=>’css-menu’, ‘menu_id’ => ‘css-menu’,
)
);
?>
– Classe CSS » active » :
add_filter(‘nav_menu_css_class’ , ‘special_nav_class’ , 10 , 2);
function special_nav_class($classes, $item){
if( in_array(‘current-menu-item’, $classes) ){
$classes[] = ‘active’;
}
return $classes;
}
Le code n’a pas du passer correctement, je vous invite à nous partager un lien pastebin. 😉
Bonjour!
J’aimerai insérer un menu dans une page directement. j’ai testé les fonctions du tuto mais ca s’integre que dans des fichiers php?
Le plugin shortcode menu peut être utile.
Bonjour, Comment faire pour supprimer des emplacements de menu déjà présents dans le thème parent ?
J’ai essayé :
Mais le menu « primary » est toujours présent dans l’admin.
Toute aide serait vivement appréciée.
Félicitations avec la version Version 3.8.1 de WordPress installation 100% réussie en 3 minutes chrono en main !
Question :
– j’ai modifié le functions.php du thème parent alors que j’ai un thème enfant. En ce cas comment doit-on faire pour ne pas perdre la modification à la prochaine MAJ de WordPress ?
Merci d’avance de votre réponse
Cela pose soucis uniquement si le thème est mis à jour. Sinon, il faut déporter les modifications du thème parent dans le thème enfant, c’est là tout le principe. 😉
Bonjour,
J’utilise le thème Enfold, j’aurais voulu savoir s’il était possible d’ajouter un emplacement de menu supplémentaire aux emplacements (déjà crées dans le thème de base) main menu, secondary menu et footer menu.
En gros j’aimerais pouvoir séparer clairement le menu du bas et le socket, qui sont trop proches à mon goût!
Bonjour Aurélien et merci,
Pour le fichier functions.php j’ai ajusté la ligne de commande
register_nav_menus( array( ‘Top’ => ‘Navigation principale’, ) );
ainsi
register_nav_menu( array( ‘Top’ => ‘Navigation principale’, ) );
Autrement dit il y avait un s en trop.
Ceci avec une version WordPress 3.7.1 et pour le thème ZeeCorporate 1.5
Thierry
Oui bien vu !
Merci beaucoup je vais essayer celà.
bonjour,
je suis en train de réaliser un site de blog que l’on m’a commandé.
Je me suis naturellement penché sur wordpress. On me demande la creation d’un menu sous formes d’icones metro ui windows 8. la gestion des menus sous wordpress n’est pas comme celle d’un site naturel. j’ai pas l’habitude de wordpress. j’ai essayé de creer celà avec des div mais il ne se comporte pas comme je le souhaite et wordpress ne se comporte pas comme je veux car pour lui ce n’est pas naturel.
J’ai essayer d’inclure avec les classes css dans wordpress et inclure les icones dans ce mode la et en travaillant sur mon style css. ca ne fait pas non plus le boulot.
Avez vous déjà créer un menu ou connaissez vous un tutoriel sur la facon de creer un menu comme windows 8?
merci de votre aide.
code à mettre dans style.css puis dans le menu, expliquer là
http://www.wpexplorer.com/adding-images-wordpress-menu/
Bonjour,
J’ai effectué votre démarche mais sans succès.
En effet, j’ai toujours mon Titre Les équipes avec les sous menus qui n’apparaissent pas, une idée?
Site : beauzelle-handball.fr
Merci de votre aide.
hello, depuis WordPress 3.6 les captures ne correspondent plus, le menu personnalisé est différent, aura-t-on à de nouvelles captures d’écran ou un nouvel article?
merci
Je note cela dans ma liste de tâches mais je ne promets rien…
Merci beaucoup j’y suis arrivé!
il y a une erreur le « top » doit être écrit en minuscule : ‘top’ ) ); ?>
Corrigé !
Petite question, le top est écrit différemment dans chaque code, une fois avec t et l’autre T. Est-ce que cela a une influence ?
Sur l’orthographe oui quand cela apparaîtra dans Apparence > Menu (pour le ‘top’ concerné).
Parfait pour moi, j’ai du adapter un peu mais ça collait à mon besoin, merci
Tuto simple et explicite. Pour ma part j’ai rencontré aucune difficulté. Et l’accent du formateur pour le parisien que je suis, m’envoie une dose de soleil qui me met de bonne humeur !!
J’ai trouvé la solution à mon problème. J’ai installé le plugin Excludes Pages et j’ai coché les pages que je ne voulais pas voir apparaître dans mon menu.
J’utilise le template Stripey. Peux-être que ça peut vous donner un indice ou peut-être que c’est facile pour vous de vérifier avec ce template. Merci pour votre support!
Je l’ai testé sur deux sites différents mais qui utilisent le même template. Sur l’un, tout fonctionne, mais sur l’autre, ça ne fonctionne pas! Est-ce que ça peut dépendre de mon hébergeur?
normalement non, il faut l’url des 2 sites.
Perso j’utilise le theme genesis – studiopress
Il y a un widget menu qui permet de placer ses menus n’importe ou sans coder 😉
Euh… la même chose est fournie de base sous WordPress aussi. 😉
Je vois que tu utilises le plugin « Post From Site » pour tes commentaires. Saurais-tu m’aider à ce sujet ? Je l’utilise également sur mon site mais lorsque j’appuie sur ‘poster’, comme toi par exemple sur ton bouton « Laisser un commentaire », j’ai un message d’erreur : {« image »: »single », »error »: » », »success »: »Votre recette a bien été ajoutée. Patientez quelques secondes pour revenir sur la page d’accueil. », »post »:280}.
Pourrais-tu m’aider ?
Non pas besoin de plugin pour gérer des commentaires sous WordPress. 😉
C’est bon j’ai réparé 🙂 mais du coup je ne sais plus du tout comment faire pour permettre d’afficher un menu :s
Bonjour,
Gros problème ! J’ai insérer le code de l’étape 1 :
__( ‘Top’ ), ‘footer-menu’ => __( ‘Footer’ ))
);
}
?>
dans mon ficher fonctions.php et maintenant plus rien de fonctionne. Ni l’admin, si mon blog. J’ai ce message d’erreur :
Parse error: syntax error, unexpected ‘<' in /homez.514/desclics/www/wp-content/themes/eliteminimal/functions.php on line 539
Merci d'avance pour votre aide
J’ai modifié les lignes de code par quelque chose de beaucoup plus récent. Merci de réessayer ! 😉
le code est vraiment correct ?
array( ‘top-navigation’ => __( ‘Top’ )
pour functions.php
‘Top’ ) ); ?>
pour header
selon Guy sur wordpress-fr.net, dnas functions.php cela devrait être
array( ‘top’ => __( ‘Top’ )
car sinon on donne 2 noms différents au menu.
‘identifiant du menu ‘top-navigation’ + le texte qui sera affiché dans Apparence/menus de l’administration de WordPress (c’est pour cela qu’il est « traduisible ») mais ce dernier n’est pas utilisé pour afficher le menu dans le thème.
Code modifié car l’article datait un peu… merci d’essayer à nouveau ! 😉
Juste une suggestion,si quelqu’un tombe sur ce tutoriel pendant la création de son thème,peut être aura-t-il besoin de la partie CSS pour faire son menu.
Pour le CSS, je ne peux que donner une idée générale car tout le monde voudra un menu à son goût. Là encore, reprendre le code du thème par défaut est une bonne solution.
c’est ce que j ‘ai fait mais est ce que tout le monde va penser à faire ça?
Bien sûr que les gens voudront personnaliser leur menu mais donner une base, un css générique serait bien et en plus cela indique que le php ne suffit pas, il ne faut pas oublier de mettre du css.
voila je voudrai afficher Le contenu de l’attribut titre du MENU dans les catégories de wordpress. J’ai déja touvé comment afficher la description des catégorie mais il me faut maintenant mettre « l’attribut titre »
Comment faire ?
Quelle est la fonction qui permettrai de faire ça ?
Où ça ?? en page d’accueil ? dans single.php ??dans category.php ou archives.php ?
catégory.php 😉
peut être il serait bien de mettre un lien vers https://wpchannel.com/creer-menus-personnalises-wordpress-3-0/ pour montrer comment fonctionne le menu personnalisé ?
Mais c’est déjà le cas en intro. 😉
oui mais il faut remonter,jouer de la souris ,moi je pensais à la fin de l’article .
bonjour,
jai voulu mettre en pratique votre tuto,
jai vérifié que le code n’exister pas déjà dans mon fichier
je l’ai copié collé
seulement voila problème , un message d’erreur est apparut :
Parse error: syntax error, unexpected ‘<' in /homez.68/stephanend/www/wp-content/themes/minimatica/functions.php on line 733
et je ne peux plus rien modifié, je ne peux plus accéder à mon wordpress.
même après déconnexion, lorsque j'essaye de me reconnecter, ce message s'affiche.
pouvez vous m'aider si il vous plaît.
je suis perdue et désespérée
merci
Le message d’erreur indique que la ligne 733 pose soucis. A priori, la balise ouvrante est en double ou n’aurait pas du être insérée.
Pour modifier le fichier functions.php, il faut passer par le client FTP (FileZilla pour ne citer que lui) et modifier le fichier présent dans /wp-content/themes/NOM_DU_THEME/functions.php
Il n’y a aucune raison de paniquer : rien de grave !
A l’avenir j’indiquerai comment être plus prudent. 😉
J’ai essayé en mettant ‘Top’ ) ); ?> dans le header mais il faut plutôt mettre :
‘top-navigation’ ) ); ?>
Merci Aurélien,
Toujours pas trouvé de solution pour mon problème, je nage mais je suis pas encore noyé…
C’est difficile de savoir sans accès au back office ou au fichiers du thème. Je peux néanmoins de proposer une prestation payante à un prix très raisonnable.
Contactes-moi si tu le désires. 😉
Bonjour,
Tout d’abord sympa l’explication et toujours aussi efficace, un grand merci au chef
Mais voilà J’ai un petit soucis que je ne comprend pas, J’ai suivi l’instruction et je vois afficher le menu sauf que le contenu de ce menu (haut en question) affiche les pages.
malgré que je pointe un menu spécifique ça marche pas.
merci d’avance de votre avis
Finalement j’ai réussi à afficher seulement j’ai accueil par défaut comment je fait pour l’enlever?
Aussi, les catégorie s’affiche l’un sur l’autre comment faire pour qu’il soit l’un à côté de l’autre ?
merci
Vérifies que ton thème n’ajoute pas une ligne de code pour le lien vers la page d’accueil. Pour l’affichage, sans doute une histoire de CSS à modifier.
Chez moi ce code ne marchait pas comme il faut.
Du coup, en repiquant le code d’un thème defaut de WP, ça marche, car on a vraiment le choix du menu dans le formulaire (le menu n’a pas forcément le nom imposé par le code)
Rajouter les ouvertures et fermetures de code php (je ne savais pas si ca passait en commentaire)…
1) pour créer des emplacements de menus perso dans “Menus”, éditer functions.php :
register_nav_menus( array( ‘menu_1’ => __( ‘Menu 1’, ‘pagelines’ ) ) );
2) A insérer dans la zone (éditer par exemple “page.php”) où faire apparaitre le menu1:
wp_nav_menu( array(‘theme_location’=>’menu_1′,’depth’ => 1, ‘fallback_cb’=>’nav_fallback_simple’) );
Et voila, et pour en créer d’autres, déclinez l’id ‘menu_1’ et le descriptif ‘Menu 1’
Et si vous voulez le formater en colonne /sidebar dans une page, par ex:
‘menu_1′,’depth’ => 1, ‘fallback_cb’=>’nav_fallback_simple’) ); ?>
En sachant que ça zappe sidebar.php pour ne pas répéter, mais qu’il faut que l’option sidebar soit activée
Et pour que ça passe dans un sidebar
(rajouter les ouvertures et fermetures à coté des div et des ?)
div class= »span-8 last »
div id= »sidebar »
?php include (THEMELIB . ‘/apps/ad-sidebar.php’); ?
?php wp_nav_menu( array(‘theme_location’=>’menu_1′,’depth’ => 1, ‘fallback_cb’=>’nav_fallback_simple’) ); ?
?php if ( !function_exists(‘dynamic_sidebar’) || !dynamic_sidebar(‘Sidebar’) ) : ?
?php endif; ?
/div
/div
Idem ! J’ai toujours le primary Navigation. L’admin me propose maintenant 3 menus : Primary navigation, Haut et Pied de page. Ça ne me gène pas. J’ai l’impression qu’il n’y a plus de conflits entre les menus. Par contre, j’ai perdu le sous-menu (Pages, Catégories et Articles) et s’est ajouté l’onglet « Accueil » …
J’ai testé mais mon thème ne prends pas les menus de base. même après quelques modifs il me garde le menu de base, bizarre ….
Salut, super tuto. Génial!!
Merci ! 😎
Bonjour,
Impossible de faire apparaitre le menu personnalisé en pied de page… Je sèche complètement malgré votre excellent travail…
Merci de m’apporter votre aide
Bonne soirée
Tricepa
Pour obtenir de l’aide, il existe le forum de WordPress francophone. Je suis débordé pour vous apporter une aide personnalisée.