{"id":234270,"date":"2023-02-25T11:04:00","date_gmt":"2023-02-25T08:04:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234270"},"modified":"2022-11-12T03:03:20","modified_gmt":"2022-11-12T00:03:20","slug":"tutoriel-sur-le-theme-wordpress-pour-les-debutants-partie-12-requete-de-publication-personnalisee","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/tutoriel-sur-le-theme-wordpress-pour-les-debutants-partie-12-requete-de-publication-personnalisee\/","title":{"rendered":"Tutoriel sur le th\u00e8me WordPress pour les d\u00e9butants \u2013 Partie 12 : Requ\u00eate de publication personnalis\u00e9e"},"content":{"rendered":"\n<p>Dans cette derni\u00e8re le\u00e7on, nous apprenons \u00e0 \u00e9crire votre propre requ\u00eate de messages et \u00e0 les parcourir sans interrompre la boucle parent dans le mod\u00e8le. Nous allons cr\u00e9er une partie de mod\u00e8le pour les articles uniques qui affiche les articles associ\u00e9s dans la m\u00eame cat\u00e9gorie.<\/p>\n<p>Ce que nous allons faire dans cette le\u00e7on est une requ\u00eate de publications associ\u00e9es dans notre vue de publication unique, montrant un maximum de 3 publications, de type publication, dans la ou les m\u00eames cat\u00e9gories que la publication dans laquelle nous nous trouvons, exclure la publication actuelle elle-m\u00eame, et randomiser les messages affich\u00e9s. Nous examinerons \u00e9galement des strat\u00e9gies pour ne pas g\u00e2cher la boucle imbriqu\u00e9e.<\/p>\n<h2>Mod\u00e8le d&rsquo;articles connexes<\/h2>\n<p>Faisons des articles associ\u00e9s une partie du mod\u00e8le, dont nous avons entendu parler dans la <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-10-fleshing-out-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">partie 10<\/a>. De cette fa\u00e7on, nous ne compliquons pas trop <code>single.php<\/code>et rendons notre code plus r\u00e9utilisable. Placez la demande de cette nouvelle partie de mod\u00e8le o\u00f9 vous le souhaitez. Je le placerai juste avant de demander le mod\u00e8le de commentaires\u00a0:<\/p>\n<pre><code>...\n    &lt;\/article&gt;\n    &lt;?php \n    get_template_part('related-posts');\n    if (comments_open()) {\n        comments_template();\n    }\n    endwhile;\n...<\/code><\/pre>\n<p>Maintenant, cr\u00e9ons un nouveau fichier vide dans notre dossier de th\u00e8me et nommons-le <code>related-posts.php<\/code>. Avec ce fichier, nous sommes pr\u00eats \u00e0 plonger dans la cr\u00e9ation d&rsquo;une requ\u00eate de publication personnalis\u00e9e.<\/p>\n<h2>Requ\u00eate de publication personnalis\u00e9e<\/h2>\n<p>Si vous souhaitez effectuer une requ\u00eate personnalis\u00e9e de messages, vous avez quelques options, mais je vous recommande de vous habituer \u00e0 la classe <code>WP_Query<\/code>. <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajoutez cette page de documentation<\/a> \u00e0 vos favoris car vous y ferez fr\u00e9quemment r\u00e9f\u00e9rence, car il y a tellement d&rsquo;options. Je vais vous montrer un exemple pratique de mise en place d&rsquo;une requ\u00eate en me r\u00e9f\u00e9rant \u00e0 la documentation de chaque sp\u00e9cification que nous voulons ajouter.<\/p>\n<p>Si vous voulez en savoir plus sur la fa\u00e7on d&rsquo;interroger les messages, j&rsquo;ai <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un article<\/a> qui va en profondeur \u00e0 ce sujet.<\/p>\n<p>Afin de cr\u00e9er une requ\u00eate de publication personnalis\u00e9e, nous appellerons <code>new WP_Query()<\/code>, lui transmettrons un tableau d&rsquo;arguments et stockerons son r\u00e9sultat dans une variable. Et ensuite, nous utiliserons exactement la m\u00eame boucle que celle que nous avons utilis\u00e9e auparavant dans nos mod\u00e8les (jetez un <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-4-accessing-posts-with-the-loop\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">coup d&rsquo;\u0153il \u00e0 la boucle d&rsquo;origine ici<\/a> pour comparer). Mais nous devons dire \u00e0 la boucle de passer par la variable, au lieu de la globale (qui est le poste unique).<\/p>\n<p>Voici \u00e0 quoi ressemblera la boucle lors de son ajout \u00e0 une requ\u00eate personnalis\u00e9e\u00a0:<\/p>\n<pre><code>$related_posts = new WP_Query([\n    \/\/ Arguments here\n]);\nif ($related_posts-&gt;have_posts()) {\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        \/\/ Access to each post here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Comme vous pouvez le voir, la boucle est exactement la m\u00eame, en utilisant <code>have_posts<\/code>et <code>the_post<\/code>. La diff\u00e9rence est que nous les appelons sur l&rsquo; <code>$related_posts<\/code>objet. Si nous sautons la <code>$related_posts<\/code>partie, WordPress suppose automatiquement qu&rsquo;il s&rsquo;agit de la requ\u00eate globale des publications.<\/p>\n<p>Vous remarquerez peut-\u00eatre \u00e9galement l&rsquo;appel de la fonction <code>wp_reset_postdata()<\/code>juste apr\u00e8s la boucle. C&rsquo;est ainsi que nous &quot;nettoyons apr\u00e8s nous-m\u00eames&quot; apr\u00e8s une requ\u00eate personnalis\u00e9e avec <code>WP_Query<\/code>. N&rsquo;oubliez pas que cela configure l&rsquo;objet de publication global afin que <code>the_post()<\/code>nous puissions utiliser <code>the_title()<\/code>etc. <code>single.php<\/code>nous nettoyons et r\u00e9initialisons la publication \u00e0 la publication unique une fois que nous avons termin\u00e9. Si nous ne r\u00e9initialisons pas les donn\u00e9es post\u00e9es, tout ce qui suit fera r\u00e9f\u00e9rence \u00e0 la derni\u00e8re publication connexe que nous avons parcourue. Cela peut \u00eatre un gros probl\u00e8me\u00a0! Dans notre exemple, nous avoir un mod\u00e8le de commentaires qui suit ceci. En omettant la r\u00e9initialisation, le mod\u00e8le de commentaire affichera les commentaires du dernier message associ\u00e9 dans la boucle. Et pas le seul message que nous examinons r\u00e9ellement\u00a0!<\/p>\n<h3>Impl\u00e9mentation de notre boucle personnalis\u00e9e<\/h3>\n<p>Tr\u00e8s bien, commen\u00e7ons \u00e0 impl\u00e9menter la boucle personnalis\u00e9e dans notre fichier <code>related-posts.php<\/code>. J&rsquo;ai ajout\u00e9 un wrapper et un titre, mais comme d&rsquo;habitude vous pouvez ajuster le HTML comme vous le souhaitez :<\/p>\n<pre><code>&lt;div class=\"related-posts\"&gt;\n    &lt;h2&gt;&lt;?php _e('Related posts', 'wptutorial'); ?&gt;&lt;\/h2&gt;\n    &lt;?php\n    $related_posts = new WP_Query([\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n        while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n\u00a0\n        endwhile;\n        wp_reset_postdata();\n    }\n    ?&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Nous allons maintenant voir la puissance de la r\u00e9utilisation dans les pi\u00e8ces de mod\u00e8le. Disons qu&rsquo;\u00e0 l&rsquo;int\u00e9rieur de cette boucle personnalis\u00e9e, nous voulons afficher exactement le m\u00eame contenu que dans notre <code>content-loop.php<\/code>, que nous utilisons dans nos mod\u00e8les d&rsquo;archive. Tout ce que nous avons \u00e0 faire est de demander cette partie de mod\u00e8le dans notre boucle personnalis\u00e9e, nous sommes tous pr\u00eats \u00e0 g\u00e9rer la sortie de chaque publication\u00a0!<\/p>\n<pre><code>...\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        get_template_part('content-loop');\n    endwhile;\n...<\/code><\/pre>\n<p>Il ne reste plus qu&rsquo;\u00e0 ajouter les arguments \u00e0 notre requ\u00eate post, en s&rsquo;assurant que nous r\u00e9cup\u00e9rons ce que nous voulons. Passons en revue les arguments un par un.<\/p>\n<h2>Construire les arguments de notre requ\u00eate de publication personnalis\u00e9e<\/h2>\n<p>Nous ne voulons pas r\u00e9cup\u00e9rer plus de messages que 3. Dans la documentation (section &quot;Param\u00e8tres de pagination&quot;), l&rsquo;argument pour cela est <code>posts_per_page<\/code>. Nous ajoutons donc l&rsquo;\u00e9l\u00e9ment de tableau\u00a0:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Nous voulons nous assurer que WordPress r\u00e9cup\u00e8re les publications, et non les pages ou autre chose. Dans \u00abPost type parameters\u00bb on trouve :<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Nous voulons emp\u00eacher que la publication unique \u00e0 laquelle nous nous trouvons n&rsquo;apparaisse dans notre requ\u00eate de publications connexes, car cela n&rsquo;a aucun sens, n&rsquo;est-ce pas\u00a0? La documentation nous indique dans \u00abPost &#038; Page parameters\u00bb que l&rsquo;on peut ajouter l&rsquo;ID de publication dans un tableau pour <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Nous voulons \u00e9galement randomiser les messages\u00a0; car par d\u00e9faut, il r\u00e9cup\u00e9rera les derniers messages publi\u00e9s et cela peut rapidement devenir assez r\u00e9p\u00e9titif au fur et \u00e0 mesure que vous parcourez les messages. Heureusement, WordPress a une fonction pour cela dans la fa\u00e7on dont il ordonne les publications ; dans \u00abOrdre et ordre par param\u00e8tres\u00bb on trouve :<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Enfin, nous souhaitons interroger les publications appartenant aux m\u00eames cat\u00e9gories que la publication dans laquelle nous nous trouvons. Pour ce faire, nous devons d&rsquo;abord, avant les arguments de requ\u00eate, obtenir les cat\u00e9gories au poste unique o\u00f9 nous nous trouvons. Dans &quot;Param\u00e8tres de cat\u00e9gorie&quot;, nous voyons que nous pouvons fournir un tableau d&rsquo;ID de cat\u00e9gorie \u00e0 <code>category__in<\/code>. Heureusement, WordPress a une fonction pour obtenir les identifiants de cat\u00e9gorie pour un article ; <code>wp_get_post_categories()<\/code>que nous pouvons utiliser directement comme valeur du param\u00e8tre. Parfait!<\/p>\n<p>Voici la requ\u00eate finale et ses arguments\u00a0:<\/p>\n<pre><code>...\n&lt;?php\n    $post_cats = wp_get_post_categories(get_the_ID());\n    $related_posts = new WP_Query([\n        'post_type' =&gt; 'post',\n        'posts_per_page' =&gt; 3,\n        'category__in' =&gt; $post_cats,\n        'post__not_in' =&gt; [get_the_ID()],\n        'orderby' =&gt; 'rand'\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n...<\/code><\/pre>\n<p>Actualisez et vous devriez voir 3 messages r\u00e9pertori\u00e9s au bas de la vue unique. Actualisez plusieurs fois pour voir qu&rsquo;ils changent parce que nous avons dit \u00e0 WordPress de les randomiser. Remarque: Si vous avez moins de 3 messages dans la m\u00eame cat\u00e9gorie, vous obtiendrez moins de 3 messages.<\/p>\n<p>C&rsquo;est \u00e7a! Vous savez maintenant comment interroger les messages que vous souhaitez. La <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">page de documentation WP_Query<\/a> est extr\u00eamement utile pour peaufiner votre requ\u00eate, car ce sont vraiment des possibilit\u00e9s illimit\u00e9es ici. Je vous encourage \u00e0 jouer avec les param\u00e8tres et peut-\u00eatre \u00e0 essayer de cr\u00e9er une partie de mod\u00e8le distincte \u00e0 utiliser pour les publications connexes.<\/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 cette le\u00e7on sur le th\u00e8me WordPress, vous apprendrez \u00e0 \u00e9crire votre propre requ\u00eate de messages et \u00e0 les parcourir sans interrompre la boucle parent dans le mod\u00e8le.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,893,717,717,832,915,1110,832,925,925,841,841,862,862],"tags":[1167],"class_list":["post-234270","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-n-a","category-sujets","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234270","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=234270"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234270\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}