{"id":231112,"date":"2022-12-15T20:31:00","date_gmt":"2022-12-15T17:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231112"},"modified":"2022-12-07T11:39:12","modified_gmt":"2022-12-07T08:39:12","slug":"modeles-darchives-personnalises-un-petit-guide","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/modeles-darchives-personnalises-un-petit-guide\/","title":{"rendered":"Mod\u00e8les d&rsquo;archives personnalis\u00e9s\u00a0: un petit guide"},"content":{"rendered":"\n<p>Chaque fois que vous travaillez avec des mod\u00e8les d&rsquo;archives dans WordPress, les publications sont g\u00e9n\u00e9ralement r\u00e9pertori\u00e9es par date dans l&rsquo;ordre d\u00e9croissant. C&rsquo;est-\u00e0-dire que les messages les plus r\u00e9cents sont r\u00e9pertori\u00e9s en haut, puis cela part de l\u00e0.<\/p>\n<p>Derni\u00e8rement, j&rsquo;ai travaill\u00e9 sur quelques projets qui s&rsquo;int\u00e8grent \u00e0 des API tierces. Ces API renvoient des dates &#8211; parfois deux dates, une date de d\u00e9but et une date de fin &#8211; pour un \u00e9v\u00e9nement donn\u00e9 et les clients souhaitent utiliser ces informations pour r\u00e9pertorier les publications plut\u00f4t que la date de la publication. Autrement dit, ils veulent des mod\u00e8les d&rsquo;archives personnalis\u00e9s.<\/p>\n<p>Ce n&rsquo;est pas trop difficile \u00e0 faire, mais avant de le faire, je pense qu&rsquo;il est important de donner quelques informations g\u00e9n\u00e9rales sur la fa\u00e7on dont le projet est construit afin qu&rsquo;il y ait un peu plus de contexte autour de pourquoi, disons, une requ\u00eate personnalis\u00e9e est n\u00e9cessaire et pourquoi vous pouvez ou pouvez pas besoin de se pencher sur <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a>.<\/p>\n<p>Je vais commencer par un TL; DR d&rsquo;abord, cependant. De cette fa\u00e7on, vous pouvez vous faire une id\u00e9e avant de tout lire.<\/p>\n<h2>Mod\u00e8les d&rsquo;archives personnalis\u00e9s<\/h2>\n<p>Donc, le TL; DR derri\u00e8re tout cela est ceci\u00a0:<\/p>\n<ul>\n<li>les informations de date fournies par l&rsquo;API tierce sont conserv\u00e9es dans la table de m\u00e9tadonn\u00e9es post,<\/li>\n<li>la cl\u00e9 est la date de d\u00e9but et la valeur est la date r\u00e9elle,<\/li>\n<li>Je commande le contenu par ordre d\u00e9croissant et par la m\u00e9ta-valeur.<\/li>\n<\/ul>\n<p>La pagination peut \u00eatre un peu probl\u00e9matique, et si vous utilisez un type de publication personnalis\u00e9, vous aurez besoin de param\u00e8tres suppl\u00e9mentaires, mais il y a l&rsquo;id\u00e9e g\u00e9n\u00e9rale.<\/p>\n<p>Passons maintenant \u00e0 l&rsquo;ensemble du montage.<\/p>\n<h3>Types de publication personnalis\u00e9s<\/h3>\n<p>En ce qui concerne l&rsquo;interface avec des API tierces, je suis un grand fan des types de publication personnalis\u00e9s, car j&rsquo;ai tendance \u00e0 les consid\u00e9rer comme un hybride entre les mod\u00e8les et les vues.<\/p>\n<ul>\n<li>Le composant de mod\u00e8le inclut tout ce qui est tangentiellement li\u00e9 et peut \u00eatre \u00e9crit dans la base de donn\u00e9es. Cela signifie toute information de taxonomie ou publication de m\u00e9tadonn\u00e9es.<\/li>\n<li>Le composant de vue est g\u00e9n\u00e9ralement tout ce qui entre dans le mod\u00e8le et qui peut exploiter les balises de mod\u00e8le pr\u00e9existantes, c&rsquo;est-\u00e0-dire tout ce qui peut devoir \u00eatre cr\u00e9\u00e9 et qui lit \u00e9galement les informations de la base de donn\u00e9es.<\/li>\n<\/ul>\n<p>Pour ce post, je vais utiliser <strong>acme-event<\/strong> comme type de post personnalis\u00e9.<\/p>\n<h3>Publier les m\u00e9tadonn\u00e9es<\/h3>\n<p>J&rsquo;ai d\u00e9fini les dates dans les m\u00e9tadonn\u00e9es de la publication plut\u00f4t que sur la publication elle-m\u00eame, car si quelque chose doit se produire dans le futur et que les donn\u00e9es sont d\u00e9finies sur l&rsquo;enregistrement de la publication elle-m\u00eame, WordPress la traitera comme une publication <strong>planifi\u00e9e<\/strong> non publi\u00e9e. .<\/p>\n<\/p>\n<p>Au lieu de cela, je pr\u00e9f\u00e9rerais que le message soit publi\u00e9, puis modifier la fa\u00e7on dont les m\u00e9tadonn\u00e9es sont affich\u00e9es dans le mod\u00e8le.<\/p>\n<h3>Pagination<\/h3>\n<p>WordPress fait une distinction subtile avec la pagination dans sa base de code. Autrement dit, la variable de requ\u00eate pour les sites sans page d&rsquo;accueil statique utilise <strong>paged<\/strong> et le cas contraire utilise <strong>page<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161511-61e724257d2b2.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-161511-61e724257d2b2.png\" alt=\"Mod\u00e8les d&#039;archives personnalis\u00e9s\u00a0: un petit guide\" ><\/a><\/p>\n<p>C&rsquo;est important lorsque vous construisez les arguments de la requ\u00eate que j&rsquo;aborderai dans un instant.<\/p>\n<h3>Archiver uniquement les pages<\/h3>\n<p>N&rsquo;oubliez pas que chaque fois que vous introduisez la pagination, vous ne souhaitez modifier la requ\u00eate que lorsque vous \u00eates sur la page d&rsquo;archives r\u00e9elle.<\/p>\n<p>Cela signifie que vous ne vous souciez pas des cas o\u00f9 vous vous trouvez dans la zone administrative de WordPress et que vous ne souhaitez pas modifier la requ\u00eate pour les archives de type publication non personnalis\u00e9es. \u00c0 cette fin, vous devez vous assurer que vous d\u00e9finissez correctement la variable de requ\u00eate dans le rappel pre_get_posts.<\/p>\n<p>Notez que je peux montrer une fonction pour savoir comment faire cela, mais en raison de la fa\u00e7on dont nous \u00e9crivons du code dans WordPress &#8211; c&rsquo;est-\u00e0-dire que certains \u00e9crivent du code proc\u00e9dural, d&rsquo;autres \u00e9crivent du code orient\u00e9 objet &#8211; je l&rsquo;afficherai simplement dans le code proc\u00e9dural.<\/p>\n<h3>Rassembler le tout<\/h3>\n<p>Tout d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">je vais cr\u00e9er la requ\u00eate\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\n$eventQuery = new WP_Query([\n    'post_type' =&gt; 'acme-events',\n    'post_status' =&gt; 'publish',\n    'orderby' =&gt; 'meta_value',\n    'order' =&gt; 'desc',\n    'meta_key' =&gt; 'acme-event-start-date-time',\n    'posts_per_archive_page' =&gt; 5,\n    'paged' =&gt; get_query_var('paged')? get_query_var('paged'): 1\n]);<\/code><\/pre>\n<p>Notez que dans le code ci-dessus, il y a un argument pour <strong>paged<\/strong>. Je vais parler du code pour cela momentan\u00e9ment.<\/p>\n<p>Ensuite, le mod\u00e8le inclura toutes les informations que vous choisissez d&rsquo;afficher. Je choisis de ne pas partager le code de mon mod\u00e8le dans cet article car il n&rsquo;est pas pertinent pour l&rsquo;id\u00e9e plus large \u00e0 port\u00e9e de main.<\/p>\n<p>De plus, vous avez tout ce dont vous avez besoin pour afficher le contenu.<\/p>\n<p>Ensuite, je vais d\u00e9finir la pagination. Tout d&rsquo;abord, je dois le faire en utilisant le crochet pre_get_posts pour <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m&rsquo;assurer que la variable de requ\u00eate appropri\u00e9e est d\u00e9finie<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('pre_get_posts', 'setCustomQueryVariable');\npublic function setCustomQueryVariable($query)\n{\n    if (is_admin() || !is_archive()) {\n        return;\n    }\n\n    if ($query-&gt;is_archive('acme-events')) {\n        set_query_var('posts_per_page', 5);\n    }\n}<\/code><\/pre>\n<p>Ensuite, je vais <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">impl\u00e9menter la pagination<\/a> \u00e0 l&rsquo;aide de la requ\u00eate personnalis\u00e9e\u00a0:<\/p>\n<pre><code>&lt;?php\n\n&lt;a class=\"next page-numbers\" href=\"&lt;?php echo esc_attr(get_next_posts_page_link($eventQuery-&gt;max_num_pages)); ?&gt;\"&gt;\n    Next Page\n&lt;\/a&gt;\n\n&lt;a class=\"prev page-numbers\" href=\"&lt;?php echo esc_attr(get_previous_posts_page_link()); ?&gt;\"&gt;\n    Previous Page\n&lt;\/a&gt;<\/code><\/pre>\n<p>Et apr\u00e8s cela, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">je r\u00e9initialiserai la variable globale $ post<\/a> en utilisant wp_reset_postdata() juste au cas o\u00f9 quelque chose de la publication d&rsquo;origine devrait \u00eatre utilis\u00e9.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>Ceci est g\u00e9n\u00e9ralement consid\u00e9r\u00e9 comme un bon entretien chaque fois que vous utilisez une requ\u00eate personnalis\u00e9e, de toute fa\u00e7on.<\/p>\n<h3>Liens utiles<\/h3>\n<p>Vous trouverez ci-dessous une liste de fonctions, de pages et de r\u00e9f\u00e9rences qui pourraient vous \u00eatre utiles en ce qui concerne le code ci-dessus ou tout travail futur que vous pourriez effectuer.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Pagination\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pagination<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/set_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">set_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">update_post_meta<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_reset_postdata\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_reset_postdata<\/a><\/li>\n<li>Le <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">code complet<\/a> dans ce post.<\/li>\n<\/ul>\n<p>Si vous travaillez avec WordPress depuis longtemps, certains d&rsquo;entre eux peuvent sembler redondants. Dans d&rsquo;autres cas, cela peut sembler nouveau, ou cela peut \u00e9clairer des domaines des API WordPress dont vous ne saviez pas qu&rsquo;ils existaient (du moins c&rsquo;\u00e9tait le cas pour moi).<\/p>\n<h2>Pourquoi s&#8217;emb\u00eater avec tout \u00e7a ?<\/h2>\n<p>Cela peut sembler \u00eatre un long message pour une t\u00e2che apparemment simple, mais les informations sont un peu dispers\u00e9es sur le Web en ce qui concerne la r\u00e9alisation de quelque chose comme \u00e7a.<\/p>\n<p>J&rsquo;ai donc voulu essayer de rassembler le tout avec des explications, des exemples de code et des liens vers des pages qui peuvent \u00eatre int\u00e9ressantes en fonction de la mani\u00e8re dont la mise en \u0153uvre est effectu\u00e9e.<\/p>\n<p>Apr\u00e8s tout, beaucoup d&rsquo;entre nous utilisent WordPress au-del\u00e0 de la gestion de contenu de base \u00e0 ce stade, mais cela ne signifie pas que nous ne devrions pas tirer parti de ses fonctions et API int\u00e9gr\u00e9es lorsque cela est possible.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Consid\u00e9rez ceci comme un cours intensif sur la cr\u00e9ation de mod\u00e8les d&rsquo;archives personnalis\u00e9s et toutes les fonctionnalit\u00e9s qui les entourent.<\/p>\n","protected":false},"author":1,"featured_media":236214,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,862],"tags":[1167],"class_list":["post-231112","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231112","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=231112"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231112\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}