{"id":231168,"date":"2022-12-16T11:05:00","date_gmt":"2022-12-16T08:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231168"},"modified":"2022-12-07T11:40:15","modified_gmt":"2022-12-07T08:40:15","slug":"pagination-wordpress-un-utilitaire-simple-et-pourquoi","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/pagination-wordpress-un-utilitaire-simple-et-pourquoi\/","title":{"rendered":"Pagination WordPress : un utilitaire simple (et pourquoi)"},"content":{"rendered":"\n<p>Lors de la cr\u00e9ation de mod\u00e8les pour WordPress, vous avez g\u00e9n\u00e9ralement des fonctions de pagination qui proviennent de l&rsquo;application elle-m\u00eame.<\/p>\n<p>Ceux-ci incluent des choses comme:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_post()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_post_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_post_link()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_post()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_post_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_post_link()<\/a><\/li>\n<\/ul>\n<p>Et il y a quelques autres articles qui vous donnent une plus grande granularit\u00e9 autour des taxonomies telles que <strong><a href=\"https:\/\/tommcfarlin.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_adjacent_post()<\/a><\/strong>.<\/p>\n<p>Je recommande de lire tous les liens ci-dessus, car ils sont utiles si vous cr\u00e9ez un th\u00e8me, travaillez avec des types de publication personnalis\u00e9s ou recherchez simplement une compr\u00e9hension plus approfondie de certaines des balises de mod\u00e8le courantes.<\/p>\n<p>Si, toutefois, vous cherchez un moyen simple d&rsquo;\u00e9crire votre utilitaire de pagination WordPress (dont j&rsquo;expliquerai momentan\u00e9ment la raison d&rsquo;\u00eatre), alors le reste de cet article couvrira exactement cela.<\/p>\n<h2>Pagination WordPress personnalis\u00e9e<\/h2>\n<p>Premi\u00e8rement, chaque fois que vous cr\u00e9ez une application Web pour quelqu&rsquo;un, il y a forc\u00e9ment des nuances dans lesquelles la fonctionnalit\u00e9 WordPress native peut ne pas fonctionner. Peut-\u00eatre que cela ne fonctionne pas comme pr\u00e9vu, cela ne fonctionne pas comme pr\u00e9vu ou cela ne r\u00e9pond pas \u00e0 vos besoins.<\/p>\n<p>Quoi qu&rsquo;il en soit, cela ne signifie pas que la pagination ne peut pas \u00eatre con\u00e7ue pour r\u00e9pondre \u00e0 vos besoins. Apr\u00e8s tout, le c\u0153ur de la pagination &#8211; en particulier en ce qui concerne la pagination \u00e0 message unique &#8211; est essentiellement ceci\u00a0:<\/p>\n<p>\u00c0 partir du message actuel, voyez si un message existe avant et voyez s&rsquo;il existe un message apr\u00e8s. Si l&rsquo;un ou l&rsquo;autre type de message existe, fournissez un lien vers celui-ci\u00a0; sinon, ne le faites pas.<\/p>\n<p>\u00c0 partir de l\u00e0, nous pouvons d\u00e9terminer que nous aurons besoin des fonctionnalit\u00e9s suivantes\u00a0:<\/p>\n<ol>\n<li>un moyen de d\u00e9terminer si une publication existe derri\u00e8re la publication actuelle,<\/li>\n<li>un moyen de d\u00e9terminer si une publication existe apr\u00e8s la publication actuelle,<\/li>\n<li>un moyen de r\u00e9cup\u00e9rer un message donn\u00e9,<\/li>\n<li>un moyen d&rsquo;obtenir le lien permanent pour le message donn\u00e9.<\/li>\n<\/ol>\n<p>Je travaille pour \u00eatre tr\u00e8s particulier dans la langue ci-dessus, cependant, car un message qui est &quot;derri\u00e8re&quot; ou &quot;apr\u00e8s&quot; un message donn\u00e9 peut ne pas avoir un ID qui est un moins que l&rsquo;ID du message actuel.<\/p>\n<p>C&rsquo;est simplement le premier message qui est publi\u00e9 et qui peut \u00eatre r\u00e9cup\u00e9r\u00e9 dans les deux sens, n&rsquo;est-ce pas\u00a0?<\/p>\n<p>Donc, dans cet esprit, cela signifie que nous aurons besoin de deux requ\u00eates\u00a0:<\/p>\n<ul>\n<li>une requ\u00eate pour r\u00e9cup\u00e9rer le post derri\u00e8re le post en cours,<\/li>\n<li>une requ\u00eate pour r\u00e9cup\u00e9rer l&rsquo;article apr\u00e8s l&rsquo;article en cours.<\/li>\n<\/ul>\n<p>Pour cet exemple, je suppose que vous avez acc\u00e8s \u00e0 l&rsquo;ID du message actuel via la fonction <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_the_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_the_ID()<\/a><\/strong>.<\/p>\n<h3>Obtenir un message derri\u00e8re le message actuel<\/h3>\n<p>Pour ce faire, nous devons cr\u00e9er une requ\u00eate simple qui r\u00e9cup\u00e9rera un article publi\u00e9 dans la base de donn\u00e9es du type d&rsquo;article sp\u00e9cifi\u00e9, et qui est li\u00e9 \u00e0 la position de l&rsquo;article actuel.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-00-previous-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Nous pouvons le faire<\/a><\/strong> en limitant le jeu de r\u00e9sultats \u00e0 un, en classant les r\u00e9sultats par ordre d\u00e9croissant et en comparant la valeur de l&rsquo;ID de publication\u00a0:<\/p>\n<pre><code>&lt;?php\n\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT *\n        FROM $wpdb-&gt;posts\n        WHERE ID &lt; (SELECT ID\n            FROM $wpdb-&gt;posts\n            WHERE ID = %d\n            AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID DESC) AND post_type = '%s'\n        AND post_status = '%s'\n        ORDER BY ID DESC\n        LIMIT 1\n        \",\n        get_the_ID(),\n        'acme-custom-post-type',\n        'publish',\n        'acme-custom-post-type',\n        'publish') );<\/code><\/pre>\n<p>Cela renverra un tableau de r\u00e9sultats que nous verrons comment g\u00e9rer dans un instant.<\/p>\n<h3>Obtenir le message apr\u00e8s le message actuel<\/h3>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-01-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pour le prochain post<\/a><\/strong>, nous \u00e9crivons une requ\u00eate similaire. Mais \u00e0 la place, nous recherchons la valeur suivante qui est plus grande et qui est en avance sur l&rsquo;ID actuel\u00a0:<\/p>\n<pre><code>&lt;?php\n\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT *\n        FROM $wpdb-&gt;posts\n        WHERE ID &gt; (SELECT ID\n            FROM $wpdb-&gt;posts\n            WHERE ID = %d\n            AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID ASC) AND post_type = '%s'\n        AND post_status = '%s'\n        ORDER BY ID ASC\n        LIMIT 1\n        \",\n        get_the_ID(),\n        'acme-custom-post-type',\n        'publish',\n        'acme-custom-post-type',\n        'publish') );<\/code><\/pre>\n<p>Nous avons maintenant besoin de quelques fonctions pour d\u00e9terminer si des messages existent. Nous pouvons le faire avec le tableau de r\u00e9sultats renvoy\u00e9.<\/p>\n<h3>V\u00e9rifier si une publication existe<\/h3>\n<p>Notez que <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-03-has-previous-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dans l&rsquo;exemple suivant<\/a><\/strong>, la fonction accepte le tableau de r\u00e9sultats et retourne simplement s&rsquo;il y a un article pr\u00e9c\u00e9dent. Les r\u00e9sultats transmis \u00e0 cette fonction doivent provenir de la requ\u00eate de publication pr\u00e9c\u00e9dente ci-dessus.<\/p>\n<p>Deuxi\u00e8mement, notez que c&rsquo;est priv\u00e9. Vous voudrez peut-\u00eatre rendre le v\u00f4tre public en fonction de la fa\u00e7on dont vous souhaitez construire vos mod\u00e8les.<\/p>\n<pre><code>&lt;?php \n\/**\n * @param array $results the results of the query to determined if there are past posts\n *\n * @return bool true if there is a previous post; otherwise, false\n *\/\nprivate function hasPreviousPost($results)\n{\n    return isset($results[0]);\n}<\/code><\/pre>\n<p>Et puis <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-04-has-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pour le post suivant,<\/a><\/strong> \u00e7a a la m\u00eame apparence mais rappelez-vous que les r\u00e9sultats qui sont pass\u00e9s dans cette fonction proviennent d&rsquo;une requ\u00eate diff\u00e9rente.<\/p>\n<pre><code>&lt;?php\n\/**\n * @param array $results the results of the query to determined if there are future posts\n *\n * @return bool true if there is a next post; otherwise, false\n *\/\nprivate function hasNextPost($results)\n{\n    return isset($results[0]);\n}<\/code><\/pre>\n<p>Et enfin, nous pouvons utiliser ces fonctions conditionnelles pour obtenir le permalien.<\/p>\n<h3>Obtenir le lien<\/h3>\n<p>N&rsquo;oubliez pas que la mani\u00e8re dont vous utilisez cette fonction peut varier de l&rsquo;impl\u00e9mentation que j&rsquo;ai fournie. Donc, si vous n&rsquo;avez pas besoin qu&rsquo;il soit priv\u00e9, modifiez sa visibilit\u00e9 et utilisez-le dans votre mod\u00e8le selon vos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-05-get-post-link-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">besoins<\/a><\/strong>.<\/p>\n<pre><code>&lt;?php\n\/**\n * @param array $results the results of the array from which to retrieve the post ID\n *\n * @return string the ID of the post to which we're going to link\n *\/\nprivate function getPostLink($results)\n{\n    return get_the_permalink($results[0]-&gt;ID);\n}<\/code><\/pre>\n<p>Enfin, notez que cette fonction accepte les r\u00e9sultats que vous lui transmettez \u00e0 partir de l&rsquo;une ou l&rsquo;autre des requ\u00eates et r\u00e9cup\u00e8re la propri\u00e9t\u00e9 ID \u00e0 partir du premier index des r\u00e9sultats.<\/p>\n<p>En effet, les r\u00e9sultats sont limit\u00e9s \u00e0 un et d\u00e9pendent de votre utilisation des fonctions conditionnelles. Autrement dit, vous pouvez faire quelque chose comme:<\/p>\n<ul>\n<li>s&rsquo;il y a un prochain article, obtenez le lien du prochain article<\/li>\n<\/ul>\n<p>Mais votre impl\u00e9mentation peut varier.<\/p>\n<h2>Pourquoi est-ce n\u00e9cessaire\u00a0?<\/h2>\n<p>Ce n&rsquo;est peut-\u00eatre pas n\u00e9cessaire. C&rsquo;est tout: si vous utilisez WordPress pr\u00eat \u00e0 l&#8217;emploi avec tr\u00e8s peu de personnalisation ou d&rsquo;extension et que vous n&rsquo;avez rien \u00e0 faire au-del\u00e0 de ce qu&rsquo;il peut fournir, vous n&rsquo;en aurez peut-\u00eatre pas besoin.<\/p>\n<p>Si, d&rsquo;un autre c\u00f4t\u00e9, vous cherchez un moyen d&rsquo;introduire la fonctionnalit\u00e9 de pagination WordPress sur un seul article, alors c&rsquo;est une fa\u00e7on de le faire qui peut g\u00e9rer correctement le cas des articles qui sont d&rsquo;un type d&rsquo;article sp\u00e9cifique mais ne le font pas. t ont des identifiants s\u00e9quentiels (et qui ne fonctionnent qu&rsquo;avec un statut de publication).<\/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>Lors de la cr\u00e9ation d&rsquo;une application Web, il y a forc\u00e9ment des nuances dans lesquelles les fonctionnalit\u00e9s natives peuvent ne pas fonctionner. Vous aurez peut-\u00eatre besoin d&rsquo;une pagination WordPress personnalis\u00e9e.<\/p>\n","protected":false},"author":1,"featured_media":236123,"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-231168","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\/231168","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=231168"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231168\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}