{"id":234208,"date":"2023-02-13T17:30:00","date_gmt":"2023-02-13T14:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234208"},"modified":"2022-11-12T00:20:24","modified_gmt":"2022-11-11T21:20:24","slug":"tutoriel-wordpress-menu-personnalise-pour-les-publications-ou-les-pages-dans-la-barre-laterale","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/tutoriel-wordpress-menu-personnalise-pour-les-publications-ou-les-pages-dans-la-barre-laterale\/","title":{"rendered":"Tutoriel WordPress : Menu personnalis\u00e9 pour les publications ou les pages dans la barre lat\u00e9rale"},"content":{"rendered":"\n<p>Cet article est pour vous qui g\u00e9rez un site WordPress qui a beaucoup de contenu, \u00e9ventuellement de nombreuses pages structur\u00e9es en hi\u00e9rarchie, et souhaitez une meilleure navigation en dehors du menu principal. Afin d&rsquo;aider \u00e0 naviguer sur le site, un menu personnalis\u00e9 li\u00e9 \u00e0 la publication actuelle vous aidera \u00e9norm\u00e9ment. Le probl\u00e8me avec le placement d&rsquo;un widget de menu dans la barre lat\u00e9rale (ou o\u00f9 vous voulez) est que la barre lat\u00e9rale est commune. Dans cet article, nous apprendrons comment afficher un menu personnalis\u00e9 suppl\u00e9mentaire dans la barre lat\u00e9rale, en autorisant les articles, les pages ou les types d&rsquo;articles personnalis\u00e9s \u00e0 choisir un menu.<\/p>\n<p>Ajoutez le code ci-dessous dans votre th\u00e8me <code>functions.php<\/code>ou dans le code de votre plugin.<\/p>\n<h2>Autoriser les publications ou les pages \u00e0 choisir un menu<\/h2>\n<p>La cr\u00e9ation de menus dans WordPress est simple et vous pouvez utiliser le widget Menu pour afficher un menu dans la barre lat\u00e9rale. Le probl\u00e8me est que la barre lat\u00e9rale est globale et le m\u00eame menu sera affich\u00e9 partout. Que faire si vous souhaitez que des menus sp\u00e9cifiques soient affich\u00e9s sur des pages sp\u00e9cifiques\u00a0? Vous apprendrez \u00e9galement comment vous assurer que le menu choisi est h\u00e9rit\u00e9 par les pages enfants. De cette fa\u00e7on, il vous suffit de s\u00e9lectionner le menu sur la page parent. Toutes les sous-pages afficheront \u00e9galement le m\u00eame menu sans qu&rsquo;il soit n\u00e9cessaire de toutes les modifier.<\/p>\n<h3>Ajout d&rsquo;une m\u00e9tabox pour choisir le menu<\/h3>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 cr\u00e9er une m\u00e9tabox sur les articles ou les pages o\u00f9 nous avons la possibilit\u00e9 de choisir un menu. Nous utilisons la fonction <code>add_meta_box()<\/code>et d\u00e9cidons pour quels types de publication nous voulons l&rsquo;afficher.<\/p>\n<pre><code>add_action('add_meta_boxes', function() {\n    add_meta_box('metabox-sidebar-menu', __('Sidebar Menu', 'txtdomain'), 'awp_sidebar_menu_metabox_callback', ['post', 'page']);\n});<\/code><\/pre>\n<p>Ajustez le code ci-dessus au titre et aux types de publication que vous souhaitez. L&rsquo;exemple ci-dessus ajoutera la m\u00e9tabox aux publications et aux pages. Le troisi\u00e8me param\u00e8tre, que j&rsquo;ai appel\u00e9 <code>awp_sidebar_menu_metabox_callback<\/code>, est la fonction responsable du rendu du contenu de la m\u00e9tabox. D\u00e9finissons cela ensuite. Voici ce que nous devrons faire dans notre metabox\u00a0:<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n\u00a0\n    \/\/ Get the current saved menu, if set\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n}<\/code><\/pre>\n<p>Nous pouvons obtenir un tableau avec tous les menus enregistr\u00e9s dans WordPress avec <code>wp_get_nav_menus()<\/code>. En ce qui concerne la r\u00e9cup\u00e9ration du menu actuel choisi, nous stockons le menu choisi en tant que post-m\u00e9ta dans <code>awp_sidebar_menu<\/code>(appelez-le comme vous le souhaitez), et nous allons simplement r\u00e9cup\u00e9rer la valeur en fonction du courant <code>$post<\/code>qui nous est fourni dans la fonction metabox. Nous enregistrerons les identifiants de menu car c&rsquo;est tout ce dont nous avons besoin pour afficher un menu. Et puis nous produisons du HTML pour une s\u00e9lection qui parcourt les menus. La sortie HTML de la m\u00e9tabox d\u00e9pend vraiment de vous, ci-dessous est un exemple. J&rsquo;ai \u00e9galement inclus une fonctionnalit\u00e9 nonce pour la s\u00e9curit\u00e9.<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n    $menus = wp_get_nav_menus();\n\u00a0\n    \/\/ Get the current saved menu, if set\n    $current_selected = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n    wp_nonce_field('awp_sidebar_menu_metabox_nonce', 'awp_sidebar_menu_nonce');\n    ?&gt;&lt;div class=\"awp-metabox-item\"&gt;\n        &lt;div class=\"awp-metabox-label\"&gt;&lt;label&gt;&lt;?php _e('Choose menu', 'txtdomain'); ?&gt;&lt;\/label&gt;&lt;\/div&gt;\n        &lt;div class=\"awp-metabox-input\"&gt;&lt;?php\n        if (empty($menus)) {\n            echo '&lt;p&gt;'. __('No menus created.', 'txtdomain'). '&lt;\/p&gt;';\n        } else { ?&gt;\n            &lt;select name=\"awp-sidebar-menu\" id=\"awp-sidebar-menu\"&gt;\n                &lt;?php \n                echo '&lt;option value=\"\"&gt;'. __('Choose menu', 'txtdomain'). '&lt;\/option&gt;';\n                foreach ($menus as $menu) { \n                    echo '&lt;option value=\"'. $menu-&gt;term_id. '\" '.selected($current_selected, $menu-&gt;term_id).'&gt;'.$menu-&gt;name.'&lt;\/option&gt;';\n                } ?&gt;\n            &lt;\/select&gt;\n        &lt;?php } ?&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;&lt;?php\n}<\/code><\/pre>\n<p>Dans la sortie HTML, j&rsquo;imprime une \u00e9tiquette. S&rsquo;il n&rsquo;y a aucun menu enregistr\u00e9 dans WordPress, il affichera simplement un paragraphe. Sinon, une s\u00e9lection est g\u00e9n\u00e9r\u00e9e avec les ID de menu comme valeurs et les noms de menu comme \u00e9tiquette. J&rsquo;ajoute \u00e9galement un choix vide pour permettre aux publications de ne pas afficher de menu. J&rsquo;utilise la fonction d&rsquo;assistance de WordPress <code>[selected](https:\/\/developer.wordpress.org\/reference\/functions\/selected\/)()<\/code>pour g\u00e9rer le marquage de l&rsquo;option enregistr\u00e9e actuelle comme s\u00e9lectionn\u00e9e.<\/p>\n<p>Si vous modifiez un article ou une page, vous devriez voir la m\u00e9tabox appara\u00eetre en bas, indiquant votre s\u00e9lection. Impressionnant! Cependant, \u00e0 ce stade, votre choix de menu ne sera pas enregistr\u00e9 lorsque vous enregistrerez la publication. C&rsquo;est la prochaine \u00e9tape.<\/p>\n<h3>Enregistrement du choix de menu<\/h3>\n<p>Nous utilisons le crochet <code>save_post<\/code>pour cr\u00e9er une fonction qui enregistre tout choix que nous avons ajout\u00e9 dans notre m\u00e9tabox. Le <code>save_post<\/code>crochet est d\u00e9clench\u00e9 chaque fois qu&rsquo;un article est enregistr\u00e9 ou mis \u00e0 jour. Nous allons d&rsquo;abord v\u00e9rifier les nonces (si vous n&rsquo;\u00eates pas s\u00fbr de ce que sont les nonces, consultez ce <a href=\"https:\/\/codex.wordpress.org\/WordPress_Nonces\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guide WordPress sur les nonces<\/a> ). Nous v\u00e9rifions ensuite si l&rsquo;utilisateur est autoris\u00e9 \u00e0 mettre \u00e0 jour les publications et mettons \u00e0 jour notre m\u00e9ta de publication avec le choix.<\/p>\n<pre><code>add_action('save_post', function($post_id) {\n    if (!isset($_POST['awp_sidebar_menu_nonce']) || !wp_verify_nonce($_POST['awp_sidebar_menu_nonce'], 'awp_sidebar_menu_metabox_nonce')) {\n        return;\n    }\n\u00a0\n    if (!current_user_can('edit_post', $post_id)) {\n        return;\n    }\n\u00a0\n    update_post_meta($post_id, 'awp_sidebar_menu', $_POST['awp-sidebar-menu']);\n});<\/code><\/pre>\n<p>D\u00e9sormais, lorsque vous mettez \u00e0 jour les publications, votre choix de menu sera \u00e9galement enregistr\u00e9.<\/p>\n<p>Et c&rsquo;est tout pour la partie choix de poste. L&rsquo;\u00e9tape suivante consiste en fait \u00e0 afficher le menu si un menu a \u00e9t\u00e9 s\u00e9lectionn\u00e9.<\/p>\n<h3>Choisir une position pour le menu personnalis\u00e9<\/h3>\n<p>J&rsquo;ajoute la sortie dans la barre lat\u00e9rale, mais vous pouvez la sortir n&rsquo;importe o\u00f9 dans les mod\u00e8les de votre th\u00e8me. Nous avons juste besoin d&rsquo;un crochet pr\u00e9d\u00e9fini ou de d\u00e9finir le n\u00f4tre. \u00c0 titre d&rsquo;exemple, j&rsquo;ajoute un crochet personnalis\u00e9 en haut de la barre lat\u00e9rale, afin que je puisse cr\u00e9er une fonction accroch\u00e9e \u00e0 cela.<\/p>\n<p>Vous pouvez simplement appeler <code>wp_nav_menu()<\/code>directement dans le mod\u00e8le, mais je vous recommande plut\u00f4t de cr\u00e9er un crochet personnalis\u00e9 car nous ajouterons pas mal de code et cela peut sembler compliqu\u00e9.<\/p>\n<p>Dans mon th\u00e8me, j&rsquo;\u00e9dite <code>sidebar.php<\/code>et juste avant <code>dynamic_sidebar()<\/code>avec la barre lat\u00e9rale est appel\u00e9e (o\u00f9 les widgets sont ajout\u00e9s), j&rsquo;ajoute mon crochet personnalis\u00e9 avec <code>do_action()<\/code>et un nom donn\u00e9. Vous pouvez l&rsquo;appeler comme vous le souhaitez, mais il doit \u00eatre unique dans WordPress. Alors au moins pr\u00e9fixez-le avec quelque chose d&rsquo;unique pour vous.<\/p>\n<pre><code>&lt;aside class=\"sidebar\"&gt;\n    &lt;?php \n    do_action('awp_before_sidebar');\n    dynamic_sidebar('left-sidebar'); \n    ?&gt;\n&lt;\/aside&gt;<\/code><\/pre>\n<h3>Rendu du menu<\/h3>\n<p>Maintenant, nous pouvons revenir \u00e0 <code>functions.php<\/code>, d\u00e9finir une fonction accroch\u00e9e \u00e0 <code>awp_before_sidebar<\/code>et sa sortie sera affich\u00e9e dans la barre lat\u00e9rale avant les widgets. La fonction utilisera <a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags#A_Single_Page.2C_a_Single_Post.2C_an_Attachment_or_Any_Other_Custom_Post_Type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">les balises conditionnelles WordPress<\/a> pour v\u00e9rifier si nous affichons actuellement ou non un seul article ou une seule page. Et si c&rsquo;est le cas, je vais chercher notre post m\u00e9ta. Si la post-m\u00e9ta a \u00e9t\u00e9 d\u00e9finie, nous publions le menu en appelant <code>[wp_nav_menu](https:\/\/developer.wordpress.org\/reference\/functions\/wp_nav_menu\/)()<\/code>et en fournissant l&rsquo;ID de menu enregistr\u00e9 comme <code>menu<\/code>param\u00e8tre.<\/p>\n<pre><code>add_action('awp_before_sidebar', function() {\n    if (is_singular()) {\n        global $post;\n\u00a0\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ?&gt;&lt;section class=\"widget awp-sidebar-menu\"&gt;\n            &lt;?php wp_nav_menu(['menu' =&gt; $sidebar_menu]); ?&gt;\n        &lt;\/section&gt;&lt;?php\n    }\n});<\/code><\/pre>\n<p>Vous devez ajuster le code HTML autour du menu pour l&rsquo;adapter au reste du contenu. Dans le code ci-dessus, j&rsquo;enveloppe le menu dans le m\u00eame code HTML que tous les widgets de la barre lat\u00e9rale, de sorte que le style de widget du th\u00e8me s&rsquo;applique \u00e0 notre menu personnalis\u00e9.<\/p>\n<p>C&rsquo;est \u00e7a! Chaque fois que vous choisissez un menu dans un article ou une page, le menu s&rsquo;affichera au-dessus de la barre lat\u00e9rale lors de l&rsquo;affichage de cet article ou de cette page.<\/p>\n<p>Nous pouvons cependant aller plus loin. Si vous souhaitez que les pages enfants affichent le m\u00eame menu de barre lat\u00e9rale d\u00e9fini dans l&rsquo;un des parents, lisez la suite.<\/p>\n<h2>Autoriser les pages enfants \u00e0 h\u00e9riter du menu parent<\/h2>\n<p>Cette fonctionnalit\u00e9 suppl\u00e9mentaire a du sens si vous avez beaucoup de pages dans une hi\u00e9rarchie ou un type de publication personnalis\u00e9 avec une hi\u00e9rarchie activ\u00e9e. Il serait trop fastidieux de modifier chaque page enfant et de choisir le m\u00eame menu. Dans ce cas, il serait pr\u00e9f\u00e9rable de choisir le menu sur la page parente et de laisser automatiquement toutes les sous-pages &quot;h\u00e9riter&quot; de ce choix de menu. Si une sous-page choisit un autre menu, ce menu sera affich\u00e9 \u00e0 la place de &quot;h\u00e9rit\u00e9&quot; une fois.<\/p>\n<p>\u00c0 l&rsquo;int\u00e9rieur de notre fonction accroch\u00e9e \u00e0 <code>awp_before_sidebar<\/code>, nous ajouterons un morceau de code, \u00e0 l&rsquo;int\u00e9rieur de la v\u00e9rification si nous visualisons un seul article ou une seule page\u00a0:<\/p>\n<pre><code>        ...\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n        if (!empty($sidebar_menu)) {\n            $parents = get_post_ancestors($post-&gt;ID);\n            if (!empty($parents)) {\n                \/\/ go step by step up the parents tree\n                for ($i = 0; $i &lt; count($parents); $i++) {\n                    $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n                    if (!empty($sidebar_menu)) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ...<\/code><\/pre>\n<p>Ce que fait le code ci-dessus si aucun menu n&rsquo;a \u00e9t\u00e9 trouv\u00e9 sur la page actuelle r\u00e9cup\u00e8re tous les parents avec <code>[get_post_ancestors](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_ancestors\/)()<\/code>. Cette fonction renvoie un tableau d&rsquo;ID de publication parent tri\u00e9s par le parent le plus proche en premier. Si la page n&rsquo;a pas de parents (par exemple s&rsquo;il s&rsquo;agit d&rsquo;un article), un tableau vide est renvoy\u00e9. Et s&rsquo;il y a des parents, nous parcourons chaque parent un par un et v\u00e9rifions s&rsquo;ils ont d\u00e9fini notre m\u00e9ta post. Si un a \u00e9t\u00e9 trouv\u00e9, nous interrompons la travers\u00e9e des parents et <code>$sidebar_menu<\/code>nous le d\u00e9finissons et le menu sera affich\u00e9 plus tard avec <code>wp_nav_menu()<\/code>.<\/p>\n<p>Et voil\u00e0 pour la fonctionnalit\u00e9 \u00abh\u00e9ritage\u00bb !<\/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 cet article, nous apprendrons comment afficher un menu personnalis\u00e9 dans la barre lat\u00e9rale (ou partout o\u00f9 vous le souhaitez), en permettant aux publications ou aux pages de choisir un menu.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,717,717,832,915,1110,801,801,832,925,925,841,841,862,862],"tags":[1167],"class_list":{"0":"post-234208","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-autre","8":"category-developpeur","10":"category-guide-pour-les-debutants","12":"category-n-a","13":"category-php-3","16":"category-sujets","18":"category-tutoriels","20":"category-wordpress-3","22":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234208","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=234208"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234208\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}