{"id":234202,"date":"2023-02-11T14:37:00","date_gmt":"2023-02-11T11:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234202"},"modified":"2022-11-12T00:04:55","modified_gmt":"2022-11-11T21:04:55","slug":"ajouter-des-meta-parametres-personnalises-conviviaux-aux-elements-de-menu-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ajouter-des-meta-parametres-personnalises-conviviaux-aux-elements-de-menu-wordpress\/","title":{"rendered":"Ajouter des m\u00e9ta-param\u00e8tres personnalis\u00e9s conviviaux aux \u00e9l\u00e9ments de menu WordPress"},"content":{"rendered":"\n<p>Dans une r\u00e9cente mise \u00e0 jour de WordPress, il est d\u00e9sormais possible et assez simple d&rsquo;ajouter des m\u00e9ta-champs personnalis\u00e9s aux \u00e9l\u00e9ments de menu. Dans cet article, nous apprendrons comment ajouter nos param\u00e8tres personnalis\u00e9s aux \u00e9l\u00e9ments de menu, mettre \u00e0 jour leurs param\u00e8tres et enfin comment utiliser les m\u00e9tadonn\u00e9es utilis\u00e9es.<\/p>\n<p>R\u00e9cemment, WordPress <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/25\/wordpress-5-4-introduces-new-hooks-to-add-custom-fields-to-menu-items\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a annonc\u00e9 la prise en charge de l&rsquo;ajout de champs personnalis\u00e9s aux \u00e9l\u00e9ments de menu<\/a> dans la version 5.4. Deux nouvelles actions ont \u00e9t\u00e9 ajout\u00e9es qui permettent aux d\u00e9veloppeurs d&rsquo;ajouter des champs personnalis\u00e9s dans la page d&rsquo;administration du menu WordPress et dans l&rsquo;\u00e9diteur de menu de Customizer. Dans cet article, nous allons nous concentrer sur l&rsquo;un d&rsquo;entre eux, celui de la page d&rsquo;administration du menu WordPress.<\/p>\n<p>Avec ce changement, il n&rsquo;est plus n\u00e9cessaire de forcer les utilisateurs de th\u00e8mes ou de plug-ins \u00e0 se souvenir et \u00e0 taper les noms de classe pour activer les &quot;param\u00e8tres&quot; des \u00e9l\u00e9ments de menu. Cela a jusqu&rsquo;\u00e0 pr\u00e9sent \u00e9t\u00e9 un processus courant pour des choses comme faire en sorte qu&rsquo;un \u00e9l\u00e9ment de menu ressemble \u00e0 un bouton ou un commutateur entre diff\u00e9rentes conceptions de liste d\u00e9roulante. Souvent en combinaison avec un menu d\u00e9roulant personnalis\u00e9.<\/p>\n<p>Gardez \u00e0 l&rsquo;esprit que pour que ce code fonctionne, la version minimale de WordPress 5.4.0 est requise.<\/p>\n<h2>Ce que nous allons faire dans ce tutoriel<\/h2>\n<p>Avec le nouveau crochet vers les \u00e9l\u00e9ments de menu et la prise en charge par WordPress de l&rsquo;ajout de m\u00e9tadonn\u00e9es aux \u00e9l\u00e9ments de menu, il n&rsquo;y a vraiment aucune limite quant au type de param\u00e8tres que vous souhaitez. Le processus d\u00e9pend de votre r\u00e9sultat final. Dans la plupart des cas, l&rsquo;ajout d&rsquo;une classe CSS personnalis\u00e9e \u00e0 l&rsquo;\u00e9l\u00e9ment de menu est suffisant.<\/p>\n<p>Pour rester simple, nous ajouterons dans cet article une case \u00e0 cocher intitul\u00e9e &quot;Afficher en tant que bouton&quot;. Dans notre th\u00e8me, nous avons un CSS qui stylisera un \u00e9l\u00e9ment de menu pour qu&rsquo;il ressemble \u00e0 un bouton (appel \u00e0 l&rsquo;action) si l&rsquo;\u00e9l\u00e9ment a une certaine classe. Au lieu de forcer l&rsquo;utilisateur du th\u00e8me \u00e0 saisir la classe CSS &quot;menu-item-button&quot; dans le champ de classe CSS de l&rsquo;\u00e9l\u00e9ment de menu dans l&rsquo;administration, nous lui proposons une case \u00e0 cocher conviviale.<\/p>\n<p>\u00c0 la fin de cet article, vous trouverez quelques id\u00e9es d&rsquo;autres actions et filtres \u00e0 utiliser si vous souhaitez faire plus que simplement ajouter une classe CSS.<\/p>\n<p>Commen\u00e7ons!<\/p>\n<h2>Ajout de champs personnalis\u00e9s aux \u00e9l\u00e9ments de menu<\/h2>\n<p>Le nouveau crochet r\u00e9cemment ajout\u00e9 est <code>[wp_nav_menu_item_custom_fields](https:\/\/developer.wordpress.org\/reference\/hooks\/wp_nav_menu_item_custom_fields\/)<\/code>. C&rsquo;est un crochet qui se d\u00e9clenche juste au-dessus des boutons de d\u00e9placement d&rsquo;un \u00e9l\u00e9ment de menu ;<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e51560662d6.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e51560662d6.png\" alt=\"Ajouter des m\u00e9ta-param\u00e8tres personnalis\u00e9s conviviaux aux \u00e9l\u00e9ments de menu WordPress\" ><\/a><\/p>\n<p>Le crochet est livr\u00e9 avec pas moins de cinq param\u00e8tres. Dans cet article, nous ferons des choses qui ne n\u00e9cessitent que les deux premiers.<\/p>\n<ul>\n<li><code>item_id<\/code>: ID de l&rsquo;\u00e9l\u00e9ment de menu actuel<\/li>\n<li><code>item<\/code>: objet de donn\u00e9es d&rsquo;\u00e9l\u00e9ment de menu<\/li>\n<li><code>depth<\/code>: profondeur de l&rsquo;\u00e9l\u00e9ment de menu dans le menu, exprim\u00e9e sous la forme d&rsquo;un nombre entier<\/li>\n<li><code>args<\/code>: Un objet d&rsquo;arguments d&rsquo;\u00e9l\u00e9ment de menu<\/li>\n<li><code>nav_id<\/code>: L&rsquo;identifiant du menu de navigation<\/li>\n<\/ul>\n<p>Toutes les entr\u00e9es ajout\u00e9es dans ce hook doivent avoir un <code>name<\/code>attribut (car l&rsquo;\u00e9diteur de menu est un formulaire). L&rsquo;attribut name peut \u00eatre nomm\u00e9 comme vous le souhaitez, mais il doit \u00eatre unique et vous devez ajouter l&rsquo;ID de l&rsquo;\u00e9l\u00e9ment de menu (premier param\u00e8tre) entre parenth\u00e8ses. Par exemple <code>name=\"my-custom-field[&lt;item ID&gt;]<\/code>&quot;. C&rsquo;est ainsi que proc\u00e8dent les autres param\u00e8tres d&rsquo;\u00e9l\u00e9ment de menu standard.<\/p>\n<p>Commen\u00e7ons par un exemple d&rsquo;ajout d&rsquo;une case \u00e0 cocher pour faire ressembler l&rsquo;\u00e9l\u00e9ment de menu \u00e0 un bouton lorsque le menu est plac\u00e9 en tant que menu principal. Nous nous accrocherons <code>wp_nav_menu_item_custom_fields<\/code>uniquement aux deux premiers param\u00e8tres et proc\u00e9derons comme suit\u00a0:<\/p>\n<pre><code>add_action('wp_nav_menu_item_custom_fields', function($item_id, $item) {\n    $show_as_button = get_post_meta($item_id, '_show-as-button', true);\n    ?&gt;\n    &lt;p class=\"awp-show-as-button description description-wide\"&gt;\n        &lt;label for=\"awp-menu-item-button-&lt;?php echo $item_id; ?&gt;\" &gt;\n            &lt;input type=\"checkbox\" \n                id=\"awp-menu-item-button-&lt;?php echo $item_id; ?&gt;\" \n                name=\"awp-menu-item-button[&lt;?php echo $item_id; ?&gt;]\" \n                &lt;?php checked($show_as_button, true); ?&gt; \n            \/&gt;&lt;?php _e('Show as a button', 'awp'); ?&gt;\n        &lt;\/label&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}, 10, 2);<\/code><\/pre>\n<p>\u00c0 la ligne, <code>#2<\/code>nous r\u00e9cup\u00e9rons la valeur actuelle de notre \u00e9l\u00e9ment de menu meta. Les \u00e9l\u00e9ments de menu utilisent la post-m\u00e9ta, nous utilisons donc <code>[get_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/)()<\/code>celle que vous connaissez probablement d\u00e9j\u00e0. Nous stockons les m\u00e9tadonn\u00e9es de l&rsquo;\u00e9l\u00e9ment de menu par la cl\u00e9 &lsquo; <code>_show-as-button<\/code>&lsquo;.<\/p>\n<p>Ensuite, il s&rsquo;agit de faire \u00e9cho \u00e0 du bon HTML. Le code ci-dessus utilise certaines des classes d\u00e9j\u00e0 utilis\u00e9es pour les \u00e9l\u00e9ments de menu afin de le rendre agr\u00e9able sans ajouter de style personnalis\u00e9 (une <code>p<\/code>balise avec les classes &quot; <code>description description-wide<\/code>&quot;).<\/p>\n<p>Les parties importantes se produisent \u00e0 la ligne <code>#8<\/code>et <code>#9<\/code>. Nous suivons la r\u00e8gle de l&rsquo;attribut name, en ajoutant le <code>$item_id<\/code>entre parenth\u00e8ses, et nous nous assurons que la valeur enregistr\u00e9e actuelle est refl\u00e9t\u00e9e dans la case \u00e0 cocher. Vous pouvez ajouter n&rsquo;importe quel type d&rsquo;entr\u00e9es, et m\u00eame plusieurs entr\u00e9es ici. N&rsquo;oubliez pas de fournir l&rsquo; <code>name<\/code>attribut appropri\u00e9 et de d\u00e9finir correctement leur valeur actuelle.<\/p>\n<p>Avec ce code dans le code de votre th\u00e8me <code>functions.php<\/code>ou plugin, vous devriez maintenant obtenir une nouvelle case \u00e0 cocher pour tous les \u00e9l\u00e9ments de menu\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e5156147558.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e5156147558.png\" alt=\"Ajouter des m\u00e9ta-param\u00e8tres personnalis\u00e9s conviviaux aux \u00e9l\u00e9ments de menu WordPress\" ><\/a><\/p>\n<p>Actuellement, cela ne sauve pas notre champ. C&rsquo;est la prochaine \u00e9tape.<\/p>\n<h2>Mise \u00e0 jour des champs personnalis\u00e9s<\/h2>\n<p>Afin de mettre \u00e0 jour les champs personnalis\u00e9s sur les \u00e9l\u00e9ments de menu, nous utilisons le hook <code>[wp_update_nav_menu_item](https:\/\/developer.wordpress.org\/reference\/hooks\/wp_update_nav_menu_item\/)<\/code>. Il est livr\u00e9 avec trois arguments mais nous n&rsquo;avons besoin que du second qui est l&rsquo;ID de l&rsquo;\u00e9l\u00e9ment de menu.<\/p>\n<p>La mani\u00e8re dont vous g\u00e9rez la sauvegarde de la valeur de vos entr\u00e9es d\u00e9pend de vous. J&rsquo;ai choisi d&rsquo;enregistrer simplement &lsquo; <code>_show-as-button<\/code>&lsquo; comme vrai ou faux. Utilisez simplement <code>[update_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/)()<\/code>et\/ou <code>[delete_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/delete_post_meta\/)()<\/code>.<\/p>\n<pre><code>add_action('wp_update_nav_menu_item', function($menu_id, $menu_item_db_id) {\n    $button_value = (isset($_POST['awp-menu-item-button'][$menu_item_db_id]) &amp;&amp; $_POST['awp-menu-item-button'][$menu_item_db_id] == 'on')? true: false;\n    update_post_meta($menu_item_db_id, '_show-as-button', $button_value);\n}, 10, 2);<\/code><\/pre>\n<p>Dans le code ci-dessus, je r\u00e9cup\u00e8re la valeur du champ personnalis\u00e9 par son nom dans le <code>$_POST<\/code>tableau. Puisqu&rsquo;il s&rsquo;agit d&rsquo;une case \u00e0 cocher, soit elle n&rsquo;existera pas dans le <code>$_POST<\/code>tableau (non coch\u00e9e), soit elle sera renvoy\u00e9e sous la forme &lsquo; <code>on<\/code>&lsquo;. Je mets ensuite \u00e0 jour la cl\u00e9 m\u00e9ta &lsquo; <code>_show-as-button<\/code>&lsquo; comme vraie ou fausse.<\/p>\n<p>Avec le code ci-dessus, vous devriez voir que votre champ se met \u00e0 jour correctement lors de l&rsquo;enregistrement du menu.<\/p>\n<p>La prochaine \u00e9tape consiste \u00e0 faire quelque chose \u00e0 propos de nos m\u00e9tadonn\u00e9es personnalis\u00e9es. Et la fa\u00e7on dont vous vous y prenez d\u00e9pend de votre r\u00e9sultat final. Comme pour notre exemple, tout ce que nous devons faire est d&rsquo;ajouter une classe personnalis\u00e9e \u00e0 l&rsquo;\u00e9l\u00e9ment de menu.<\/p>\n<h2>Mettre \u00e0 jour la classe CSS de l&rsquo;\u00e9l\u00e9ment de menu<\/h2>\n<p>WordPress propose un filtre sur les classes de l&rsquo;\u00e9l\u00e9ment de menu: <code>[nav_menu_css_class](https:\/\/developer.wordpress.org\/reference\/hooks\/nav_menu_css_class\/)<\/code>. Tout ce que nous avons \u00e0 faire est d&rsquo;ajouter une classe personnalis\u00e9e au tableau par ce filtre si notre m\u00e9ta personnalis\u00e9e est <code>true<\/code>. Nous utilisons <code>[get_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/)()<\/code>pour obtenir la valeur de &lsquo; <code>_show-as-button<\/code>&lsquo; et si c&rsquo;est vrai, nous ajoutons la classe CSS &lsquo; <code>menu-item-button<\/code>&lsquo;\u00a0:<\/p>\n<pre><code>add_filter('nav_menu_css_class', function($classes, $menu_item) {\n    $show_as_button = get_post_meta($menu_item-&gt;ID, '_show-as-button', true);\n    if ($show_as_button) {\n        $classes[] = 'menu-item-button';\n    }\n    return $classes;\n}, 10, 2);<\/code><\/pre>\n<p>Le <code>nav_menu_css_class<\/code>filtre est livr\u00e9 avec un total de quatre arguments, y compris les arguments de menu et la profondeur de l&rsquo;\u00e9l\u00e9ment de menu. Si n\u00e9cessaire, vous pouvez faire en sorte que les noms de classe soient affect\u00e9s par ces valeurs. Par exemple, cela n&rsquo;aurait g\u00e9n\u00e9ralement pas de sens de transformer un \u00e9l\u00e9ment de menu en bouton \u00e0 moins qu&rsquo;il ne se trouve au niveau sup\u00e9rieur (et non \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un menu d\u00e9roulant).<\/p>\n<p>Avec le code ci-dessus, vous devriez maintenant voir que tout \u00e9l\u00e9ment de menu qui a coch\u00e9 &quot;Afficher en tant que bouton&quot; obtiendra la classe &lsquo; <code>menu-item-button<\/code>&lsquo;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e515621cd00.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e515621cd00.png\" alt=\"Ajouter des m\u00e9ta-param\u00e8tres personnalis\u00e9s conviviaux aux \u00e9l\u00e9ments de menu WordPress\" ><\/a><\/p>\n<p>Gardez \u00e0 l&rsquo;esprit: vous pouvez constater que le <code>nav_menu_css_class<\/code>filtre n&rsquo;est pas appliqu\u00e9 si le menu utilise un explorateur de menu personnalis\u00e9 qui contient par exemple la m\u00e9thode <code>start_el()<\/code>. Le marcheur doit appliquer le <code>nav_menu_css_class<\/code>filtre sur les classes de l&rsquo;\u00e9l\u00e9ment de menu (en utilisant <code>apply_filters()<\/code>) pour que le filtre ci-dessus fonctionne\u00a0!<\/p>\n<h2>Autres utilisations des champs m\u00e9ta personnalis\u00e9s des \u00e9l\u00e9ments de menu<\/h2>\n<p>Comme mentionn\u00e9, le processus d&rsquo;utilisation des champs personnalis\u00e9s d\u00e9pend du r\u00e9sultat final. Il est difficile de faire un post qui couvre toutes les possibilit\u00e9s. Mais cela devrait au moins vous donner des id\u00e9es. L&rsquo;exemple ci-dessus montre comment ajouter simplement une classe personnalis\u00e9e \u00e0 l&rsquo;\u00e9l\u00e9ment de menu.<\/p>\n<p>Dans d&rsquo;autres cas, vous voudrez peut-\u00eatre prendre l&rsquo;avance des m\u00e9tadonn\u00e9es dans un menu d\u00e9roulant. Dans la plupart des fonctions d&rsquo;un navigateur de menu, vous avez acc\u00e8s \u00e0 l&rsquo;ID de l&rsquo;\u00e9l\u00e9ment de menu et vous pouvez ainsi facilement r\u00e9cup\u00e9rer les m\u00e9tadonn\u00e9es.<\/p>\n<p>Une alternative \u00e0 l&rsquo;utilisation d&rsquo;un explorateur de menu personnalis\u00e9, vous pouvez utiliser le filtre <code>[wp_setup_nav_menu_item](https:\/\/developer.wordpress.org\/reference\/functions\/wp_setup_nav_menu_item\/)<\/code>pour plus de contr\u00f4le sur l&rsquo;objet de l&rsquo;\u00e9l\u00e9ment de menu.<\/p>\n<p>Ou vous pouvez utiliser le filtre <code>[wp_get_nav_menu_items](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_nav_menu_items\/)<\/code>pour exclure, par exemple, des \u00e9l\u00e9ments de menu, si votre param\u00e8tre est de limiter la visibilit\u00e9 des \u00e9l\u00e9ments de menu.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans une r\u00e9cente mise \u00e0 jour de WordPress, il est d\u00e9sormais possible et assez simple d&rsquo;ajouter des m\u00e9ta-champs personnalis\u00e9s aux \u00e9l\u00e9ments de menu. Dans cet article, nous allons apprendre comment\u00a0!<\/p>\n","protected":false},"author":1,"featured_media":223830,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,717,717,832,1110,801,801,832,925,925,841,841,862,862],"tags":[1167],"class_list":["post-234202","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-n-a","category-php-3","category-sujets","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234202"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234202\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223830"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234202"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}