{"id":234266,"date":"2023-02-24T11:40:00","date_gmt":"2023-02-24T08:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234266"},"modified":"2022-11-12T02:53:05","modified_gmt":"2022-11-11T23:53:05","slug":"guide-comment-interroger-des-publications-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/guide-comment-interroger-des-publications-dans-wordpress\/","title":{"rendered":"Guide\u00a0: comment interroger des publications dans WordPress"},"content":{"rendered":"\n<p>Quelles sont les m\u00e9thodes disponibles pour cr\u00e9er une requ\u00eate de publication personnalis\u00e9e et quand sont-elles pr\u00e9f\u00e9rables\u00a0? Cet article vise \u00e0 \u00e9tablir une solide compr\u00e9hension de deux m\u00e9thodes d&rsquo;interrogation des articles, comment acc\u00e9der aux r\u00e9sultats, comment construire des arguments et enfin comment nettoyer apr\u00e8s. Les deux m\u00e9thodes que nous allons examiner sont <code>get_posts()<\/code>et <code>WP_Query<\/code>.<\/p>\n<p>Quand il s&rsquo;agit de faire une nouvelle requ\u00eate de publication, il y a vraiment deux options (au moment de la r\u00e9daction). Le choix d\u00e9pend vraiment de vos pr\u00e9f\u00e9rences (et de quelques effets mineurs sur les performances). Une option a le potentiel de g\u00e2cher la boucle\/requ\u00eate globale dans laquelle vous vous trouvez actuellement, sauf si vous la g\u00e9rez correctement. Avec une option, vous manipulez des objets et dans l&rsquo;autre option, vous manipulez un tableau. Les arguments de personnalisation de la requ\u00eate post sont cependant identiques.<\/p>\n<h2>Requ\u00eate globale\u00a0?<\/h2>\n<p>Si vous n&rsquo;\u00eates pas s\u00fbr de ce que je veux dire par &quot;g\u00e2cher la requ\u00eate globale&quot;, c&rsquo;est ceci. WordPress fait toujours une requ\u00eate globale, selon la page sur laquelle vous vous trouvez. Si un visiteur visite une archive de cat\u00e9gorie, WordPress a fait une requ\u00eate de publication pour cette Le th\u00e8me acc\u00e9derait normalement aux articles de la requ\u00eate en utilisant &quot;la boucle&quot;. Lorsque nous faisons une nouvelle requ\u00eate avec sa propre boucle \u00e0 l&rsquo;int\u00e9rieur de cette boucle, nous devons nous assurer que la requ\u00eate globale de WordPress et notre requ\u00eate sont trait\u00e9es s\u00e9par\u00e9ment.<\/p>\n<p>Cependant, si vous souhaitez modifier la requ\u00eate de publication de WordPress, c&rsquo;est une autre histoire. J&rsquo;ai un <a href=\"http:\/\/awhitepixel.com\/blog\/modifying-wordpress-global-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">autre post<\/a> qui va en profondeur sur la fa\u00e7on de le faire.<\/p>\n<p>Examinons les deux options qui s&rsquo;offrent \u00e0 nous et comment nous les g\u00e9rons. Apr\u00e8s cela, nous verrons les arguments pour personnaliser la requ\u00eate. Gardez \u00e0 l&rsquo;esprit que les arguments sont identiques pour les deux.<\/p>\n<h2><strong>Les deux m\u00e9thodes d&rsquo;interrogation des posts<\/strong><\/h2>\n<p>Vous pouvez interroger les publications avec la fonction <code>get_posts()<\/code>ou cr\u00e9er une nouvelle instance de <code>WP_Query.<\/code>La premi\u00e8re option renvoie un tableau de publications et dans la seconde, vous g\u00e9rez un objet. Parce que <code>get_posts()<\/code>renvoie un tableau contenant uniquement les messages, il est g\u00e9n\u00e9ralement plus simple de l&rsquo;utiliser o\u00f9 vous le souhaitez. Cependant, si vous souhaitez paginer votre requ\u00eate, vous devez absolument opter pour la cr\u00e9ation d&rsquo;une <code>WP_Query<\/code>instance.<\/p>\n<p>La fonction <code>get_posts<\/code>est une fonction wrapper, <code>WP_Query<\/code>ce qui signifie qu&rsquo;elle accepte les m\u00eames arguments, mais <code>get_posts<\/code>a quelques arguments &quot;alias&quot; suppl\u00e9mentaires. La page de documentation de WordPress pour <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_posts<\/a> ne r\u00e9pertorie pas les arguments possibles (\u00e0 l&rsquo;exception des arguments d&rsquo;alias), mais fait r\u00e9f\u00e9rence \u00e0 la page de documentation de <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> pour les arguments. Nous reviendrons plus en d\u00e9tail sur les arguments plus tard.<\/p>\n<p>Si les performances sont un probl\u00e8me (c&rsquo;est-\u00e0-dire que le site contient beaucoup de messages), <code>get_posts<\/code>est plus rapide que d&rsquo;utiliser <code>WP_Query<\/code>car il ignore le calcul de la pagination.<\/p>\n<p>La m\u00e9thode de boucle dans votre requ\u00eate de publication personnalis\u00e9e diff\u00e8re selon la m\u00e9thode que vous choisissez. Vous devez \u00eatre familiaris\u00e9 avec la boucle WordPress commune utilis\u00e9e dans presque tous les mod\u00e8les de th\u00e8me\u00a0:<\/p>\n<pre><code>if (have_posts()) {\n    while (have_posts()): the_post();\n        \/\/ Access to each post; you can use template tags here\n    endwhile;\n}<\/code><\/pre>\n<h3><strong>Boucler en utilisant WP_Query<\/strong><\/h3>\n<p>La boucle des r\u00e9sultats de l&rsquo;utilisation <code>WP_Query<\/code>est exactement la m\u00eame, sauf que nous nous r\u00e9f\u00e9rons sp\u00e9cifiquement \u00e0 l&rsquo;objet instance dans la boucle. Nous devons \u00e9galement nous rappeler de &quot;r\u00e9initialiser l&rsquo;\u00e9tat&quot; une fois que nous avons termin\u00e9 la boucle afin que l&rsquo;objet de publication global revienne \u00e0 ce qu&rsquo;il \u00e9tait avant. Pour ce faire, nous utilisons <code>wp_reset_postdata()<\/code>.<\/p>\n<pre><code>$custom_query = new WP_Query([\/ Arguments here \/]);\nif ($custom_query-&gt;have_posts()) {\n    while ($custom_query-&gt;have_posts()): $custom_query-&gt;the_post();\n        \/\/ Access to each post; you can use template tags here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Si vous videz l&rsquo;objet instanci\u00e9 par <code>WP_Query<\/code>( <code>$custom_query<\/code>dans l&rsquo;exemple ci-dessus), vous trouverez la requ\u00eate compl\u00e8te et les arguments utilis\u00e9s. Les parties int\u00e9ressantes ici sont les propri\u00e9t\u00e9s &lsquo; <code>found_posts<\/code>&lsquo; et &lsquo; <code>posts<\/code>&lsquo;. La <code>posts<\/code>propri\u00e9t\u00e9 &lsquo; &lsquo; contient le r\u00e9sultat des objets post par lesquels la boucle passera. Le nombre de publications correspondant \u00e0 votre requ\u00eate est renvoy\u00e9 entre &lsquo; <code>found_posts<\/code>&lsquo; et est utile si vous souhaitez cr\u00e9er une pagination personnalis\u00e9e. Divisez cette valeur avec le param\u00e8tre WordPress pour le nombre de publications par page pour d\u00e9terminer le nombre de pages dont vous avez besoin pour votre requ\u00eate, ou faites simplement r\u00e9f\u00e9rence \u00e0 la propri\u00e9t\u00e9 \u00ab<code>max_num_pages<\/code>\u00bb.<\/p>\n<p>Remarque: Lorsque vous utilisez <code>get_posts<\/code>WordPress, seule la <code>posts<\/code>propri\u00e9t\u00e9 &lsquo; &lsquo; (qui est un tableau) est renvoy\u00e9e de l&rsquo; <code>WP_Query<\/code>objet.<\/p>\n<h3><strong>Boucler en utilisant get_posts<\/strong><\/h3>\n<p>En utilisant <code>get_posts<\/code>, nous n&rsquo;utilisons pas la &quot;boucle WordPress&quot; habituelle, mais nous utilisons une boucle de tableau PHP normale. Chaque \u00e9l\u00e9ment du tableau est un post-objet et aucune r\u00e9initialisation n&rsquo;est n\u00e9cessaire une fois la boucle termin\u00e9e. Gardez \u00e0 l&rsquo;esprit que les balises de mod\u00e8le (telles que <code>the_title()<\/code>, <code>the_permalink()<\/code>etc.) ne sont pas disponibles dans cette boucle. Vous devrez vous r\u00e9f\u00e9rer aux propri\u00e9t\u00e9s de l&rsquo;objet post (par exemple <code>$custom_post-&gt;ID<\/code>).<\/p>\n<pre><code>$custom_query = get_posts([\/ Arguments here \/]);\nforeach ($custom_query as $custom_post) {\n    \/\/ Template tags are not available here, refer to the post object properties, for example:\n    echo $custom_post-&gt;post_title;\n}<\/code><\/pre>\n<p>Je vous recommande de nommer vos objets de publication diff\u00e9remment de <code>$post<\/code>. Vous pouvez rencontrer des probl\u00e8mes lorsque vous essayez d&rsquo;acc\u00e9der aux propri\u00e9t\u00e9s de publication (cela peut faire r\u00e9f\u00e9rence \u00e0 l&rsquo;objet de publication global et non \u00e0 la publication dans la boucle).<\/p>\n<p>Si vous souhaitez utiliser des <a href=\"https:\/\/codex.wordpress.org\/Template_tags#Post_tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">balises de mod\u00e8le<\/a> pour acc\u00e9der plus facilement aux informations de publication (telles que <code>the_title()<\/code>et <code>the_permalink()<\/code>), vous pouvez le faire. Pour ce faire, dites \u00e0 WordPress de configurer l&rsquo;objet post global \u00e0 l&rsquo;int\u00e9rieur de la boucle avec <code>setup_postdata()<\/code>. Si vous faites cela, vous devrez r\u00e9initialiser l&rsquo;\u00e9tat <code>wp_reset_postdata()<\/code>apr\u00e8s la boucle.<\/p>\n<pre><code>$custom_query = get_posts([\/ Arguments here \/]);\nforeach ($custom_query as $post) {\n    setup_postdata($post);\n    \/\/ Template tags are available here, for example:\n    the_title();\n}\nwp_reset_postdata();<\/code><\/pre>\n<p>Gardez \u00e0 l&rsquo;esprit que <code>setup_postdata<\/code>les objets que vous parcourez (la <code>as<\/code>partie &quot; &quot; dans la boucle foreach) doivent \u00eatre nomm\u00e9s<code>$post<\/code>! Dans le premier exemple, j&rsquo;ai nomm\u00e9 les objets post <code>$custom_post<\/code>et cela ne fonctionnerait pas avec <code>setup_postdata()<\/code>.<\/p>\n<p>Cependant, si vous avez juste besoin d&rsquo;acc\u00e9der aux informations de publication de base, vous pouvez \u00e9galement ignorer la configuration de l&rsquo;objet de publication global et utiliser plut\u00f4t les <code>get_<\/code>balises de mod\u00e8le &quot; &quot; correspondantes et l&rsquo;ID de publication. Par exemple, la balise <code>the_permalink()<\/code>ne fonctionne correctement que si l&rsquo;objet post global est configur\u00e9, mais vous pouvez demander le permalien post sans l&rsquo;objet post global simplement en utilisant <code>echo get_the_permalink($custom_post-&gt;ID)<\/code>.<\/p>\n<h2><strong>Arguments de requ\u00eate<\/strong><\/h2>\n<p>Vous pouvez trouver la liste compl\u00e8te de tous les arguments possibles sur <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la page de documentation de WP_Query<\/a>. Des exemples de param\u00e8tres sont des articles avec des termes sp\u00e9cifiques d&rsquo;une taxonomie, des m\u00e9ta-valeurs d&rsquo;articles, des types d&rsquo;articles, l&rsquo;inclusion ou l&rsquo;exclusion d&rsquo;articles sp\u00e9cifiques et toute une gamme d&rsquo;options pour ordonner les r\u00e9sultats. Il y en a trop pour les d\u00e9tailler, mais voici quelques exemples courants d&rsquo;arguments pour interroger les publications.<\/p>\n<h3>Exemple\u00a01\u00a0: Publications associ\u00e9es de la m\u00eame cat\u00e9gorie<\/h3>\n<p>Supposons que vous souhaitiez afficher une \u00abpublication associ\u00e9e\u00bb \u00e0 la fin d&rsquo;une seule publication. Il doit montrer une s\u00e9lection al\u00e9atoire de 3 messages qui sont dans la m\u00eame cat\u00e9gorie que le message actuel, et il doit exclure le message actuel du r\u00e9sultat.<\/p>\n<pre><code>$post_id = get_the_ID();  \/\/ current post ID\n$custom_query = new WP_Query([\n    'post_type' =&gt; 'post',\n    'posts_per_page' =&gt; 3,\n    'category__in' =&gt; wp_get_post_categories($post_id),\n    'post__not_in' =&gt; [$post_id],\n    'orderby' =&gt; 'rand'\n]);<\/code><\/pre>\n<p>Les arguments sont assez explicites. Je demande uniquement &lsquo; <code>post<\/code>&lsquo; dans &lsquo; <code>post_type<\/code>&lsquo; et un maximum de 3 messages dans &lsquo; <code>posts_per_page'<\/code>.<\/p>\n<p>Pour interroger les publications dans les cat\u00e9gories, vous pouvez cr\u00e9er une <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#taxonomy-parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tax_query<\/a> ou utiliser le plus simple &lsquo; <code>category__in<\/code>&lsquo; (NB\u00a0: ne fonctionne que pour la cat\u00e9gorie de publication). Dans l&rsquo;exemple ci-dessus, j&rsquo;utilise <code>wp_get_post_categories()<\/code>pour obtenir un tableau d&rsquo;identifiants de terme attribu\u00e9s au message fourni, et je l&rsquo;utilise pour l&rsquo;argument &lsquo; <code>category__in<\/code>&lsquo;.<\/p>\n<p>Vous pouvez exclure les ID de publication avec &lsquo; <code>post__not_in<\/code>&lsquo; alors que j&rsquo;ai fourni l&rsquo;ID de publication actuel. Enfin j&rsquo;ai demand\u00e9 un ordre al\u00e9atoire des posts en mettant &lsquo; <code>rand<\/code>&lsquo; dans &lsquo; <code>orderby<\/code>&lsquo;. Vous pouvez fournir par exemple &lsquo; <code>title<\/code>&lsquo; ou &lsquo; <code>date<\/code>&lsquo; pour les ordonner diff\u00e9remment. Jetez un \u0153il \u00e0 la <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#order-orderby-parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentation de commande<\/a> pour voir ce qui est possible.<\/p>\n<h3>Exemple\u00a02\u00a0: Toutes les publications d&rsquo;un type de publication personnalis\u00e9 avec plusieurs arguments de classement<\/h3>\n<p>Dans cet exemple, nous supposons que vous avez un type de publication personnalis\u00e9 &lsquo; <code>book<\/code>&lsquo; et dans un mod\u00e8le de page personnalis\u00e9, vous souhaitez afficher tous les livres publi\u00e9s. Vous souhaitez ordonner les messages principalement par menu_order (l&rsquo;attribut de la page, c&rsquo;est un nombre que vous pouvez d\u00e9finir par message), et deuxi\u00e8mement le titre du message.<\/p>\n<pre><code>$custom_query = new WP_Query([\n    'post_type' =&gt; 'book',\n    'posts_per_page' =&gt; -1,\n    'orderby' =&gt; ['meny_order' =&gt; 'ASC', 'title' =&gt; 'DESC']\n]);<\/code><\/pre>\n<p>Encore une fois, les arguments sont assez explicites. Je demande le type de message &lsquo; <code>book<\/code>&lsquo; comme &lsquo; <code>post_type<\/code>&lsquo;. Lorsque vous d\u00e9finissez &lsquo; <code>posts_per_page<\/code>&lsquo; sur -1, il r\u00e9cup\u00e8re tous (messages publi\u00e9s, sauf si vous sp\u00e9cifiez quelque chose de diff\u00e9rent dans <code>post_status<\/code>l&rsquo;argument &lsquo; &lsquo;). Enfin je fournis un tableau \u00e0 &lsquo; <code>orderby<\/code>&lsquo; pour indiquer \u00e0 WordPress de trier les articles principalement par ordre de menu dans l&rsquo;ordre croissant, et deuxi\u00e8mement le titre de l&rsquo;article dans l&rsquo;ordre d\u00e9croissant.<\/p>\n<h3>Exemple\u00a03\u00a0: Publications avec des m\u00e9tadonn\u00e9es personnalis\u00e9es<\/h3>\n<p>Supposons que vous ayez un type de publication personnalis\u00e9 &quot; <code>book<\/code>&quot; et que vous souhaitiez interroger tous les livres non publi\u00e9s ou un livre publi\u00e9 entre 1990 et 2019.<\/p>\n<pre><code>$custom_query = new WP_Query([\n    'post_type' =&gt; 'book',\n    'posts_per_page' =&gt; -1,\n    'meta_query' =&gt; [\n        'relation' =&gt; 'OR',\n        [\n            'key' =&gt; 'book_status',\n            'value' =&gt; 'unpublished',\n            'compare' =&gt; '='\n        ],\n        [\n            'key' =&gt; 'year_published',\n            'value' =&gt; [1990, 2019],\n            'type' =&gt; 'numeric',\n            'compare' =&gt; 'BETWEEN'\n        ]\n    ]\n]);<\/code><\/pre>\n<p>Il est pr\u00e9f\u00e9rable de cr\u00e9er une requ\u00eate en utilisant post meta <code>meta_query<\/code>(pour des m\u00e9ta arguments tr\u00e8s simples, vous pouvez utiliser <code>meta_key<\/code>et <code>meta_value<\/code>directement). L&rsquo; <code>meta_query<\/code>argument &lsquo; &lsquo; n\u00e9cessite un tableau, o\u00f9 chaque argument est un tableau. Vous pouvez contr\u00f4ler la relation entre chaque argument avec &lsquo; <code>relation<\/code>&lsquo;, que j&rsquo;ai d\u00e9fini sur &lsquo; <code>OR<\/code>&lsquo; dans l&rsquo;exemple ci-dessus.<\/p>\n<p>Je fournis deux arguments de m\u00e9tadonn\u00e9es \u00e0 &lsquo; <code>meta_query<\/code>&lsquo;. La premi\u00e8re compare simplement la cl\u00e9 m\u00e9ta &lsquo; <code>book_status<\/code>&lsquo; au texte &lsquo; <code>unpublished<\/code>&lsquo;, et si elle est \u00e9gale, elle sera incluse. Dans le deuxi\u00e8me argument, je dis \u00e0 WordPress d&rsquo;obtenir n&rsquo;importe quelle valeur dans la cl\u00e9 m\u00e9ta &lsquo; <code>year_published<\/code>&lsquo; entre les nombres 1990 et 2019.<\/p>\n<h2>Conclusion<\/h2>\n<p>Vous devriez maintenant avoir une compr\u00e9hension de base des deux m\u00e9thodes d&rsquo;interrogation des publications. Il n&rsquo;y a pas une grande diff\u00e9rence car vous pouvez cr\u00e9er la m\u00eame requ\u00eate en utilisant les deux, mais la mani\u00e8re de g\u00e9rer les deux est diff\u00e9rente. Les trois exemples d&rsquo;arguments de requ\u00eate fournis ne font qu&rsquo;effleurer la surface des requ\u00eates que vous pouvez cr\u00e9er. Reportez-vous \u00e0 <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentation WP_Query<\/a> pour un aper\u00e7u complet avec de nombreux exemples.<\/p>\n<p>Si vous \u00eates curieux de savoir comment modifier la requ\u00eate globale effectu\u00e9e par WordPress, j&rsquo;ai un <a href=\"http:\/\/awhitepixel.com\/blog\/modifying-wordpress-global-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">article s\u00e9par\u00e9<\/a> qui approfondit ce sujet.<\/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 ce guide, nous examinerons deux m\u00e9thodes d&rsquo;interrogation des articles dans WordPress (get_posts et WP_Query), comment acc\u00e9der \u00e0 chaque article et cr\u00e9er des arguments.<\/p>\n","protected":false},"author":1,"featured_media":224094,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,893,717,717,915,1110,801,801,925,925,841,841,862,862],"tags":[1167],"class_list":["post-234266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","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\/234266","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=234266"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234266\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224094"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}