{"id":231264,"date":"2022-12-16T10:31:00","date_gmt":"2022-12-16T07:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231264"},"modified":"2022-12-07T11:40:17","modified_gmt":"2022-12-07T08:40:17","slug":"paginacao-do-wordpress-um-utilitario-simples-e-por-que","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/paginacao-do-wordpress-um-utilitario-simples-e-por-que\/","title":{"rendered":"Pagina\u00e7\u00e3o do WordPress: um utilit\u00e1rio simples (e por qu\u00ea)"},"content":{"rendered":"\n<p>Ao criar templates para WordPress, voc\u00ea geralmente tem fun\u00e7\u00f5es de pagina\u00e7\u00e3o que v\u00eam do pr\u00f3prio aplicativo.<\/p>\n<p>Estes incluem coisas como:<\/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>E h\u00e1 algumas outras postagens que oferecem maior granularidade em torno de taxonomias, como <strong><a href=\"https:\/\/tommcfarlin.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_adjacent_post()<\/a><\/strong>.<\/p>\n<p>Eu recomendo ler todos os links acima porque eles s\u00e3o \u00fateis se voc\u00ea estiver criando um tema, trabalhando com tipos de postagem personalizados ou simplesmente procurando uma compreens\u00e3o mais profunda de algumas das tags de modelo comuns.<\/p>\n<p>Se, no entanto, voc\u00ea estiver procurando uma maneira f\u00e1cil de escrever seu utilit\u00e1rio de pagina\u00e7\u00e3o do WordPress (para o qual explicarei a l\u00f3gica momentaneamente), o restante deste post abordar\u00e1 exatamente isso.<\/p>\n<h2>Pagina\u00e7\u00e3o personalizada do WordPress<\/h2>\n<p>Primeiro, sempre que voc\u00ea estiver criando um aplicativo da Web para algu\u00e9m, haver\u00e1 nuances nas quais a funcionalidade nativa do WordPress pode n\u00e3o funcionar. Talvez n\u00e3o funcione como esperado, n\u00e3o funcione como pretendido ou n\u00e3o atenda \u00e0s suas necessidades.<\/p>\n<p>Seja qual for o caso, isso n\u00e3o significa que a pagina\u00e7\u00e3o n\u00e3o possa ser constru\u00edda para servir aos seus prop\u00f3sitos. Afinal, o n\u00facleo da pagina\u00e7\u00e3o \u2013 especialmente no que se refere \u00e0 pagina\u00e7\u00e3o de postagem \u00fanica \u2013 \u00e9 basicamente isso:<\/p>\n<p>A partir do post atual, veja se existe um post antes dele e veja se existe um post depois dele. Se um dos tipos de postagem existir, forne\u00e7a um link para ele; caso contr\u00e1rio, n\u00e3o.<\/p>\n<p>A partir daqui, podemos determinar que precisaremos dos seguintes recursos:<\/p>\n<ol>\n<li>uma maneira de determinar se uma postagem existe atr\u00e1s da postagem atual,<\/li>\n<li>uma maneira de determinar se uma postagem existe ap\u00f3s a postagem atual,<\/li>\n<li>uma maneira de recuperar uma determinada postagem,<\/li>\n<li>uma maneira de obter o permalink para o determinado post.<\/li>\n<\/ol>\n<p>Eu trabalho para ser muito espec\u00edfico na linguagem acima, no entanto, porque uma postagem que est\u00e1 &quot;atr\u00e1s&quot; ou &quot;depois&quot; de uma determinada postagem pode n\u00e3o ter um ID menor que o ID da postagem atual.<\/p>\n<p>\u00c9 simplesmente o primeiro post publicado e pode ser recuperado em qualquer dire\u00e7\u00e3o, certo?<\/p>\n<p>Ent\u00e3o, com isso em mente, isso significa que precisaremos de duas consultas:<\/p>\n<ul>\n<li>uma consulta para recuperar a postagem por tr\u00e1s da postagem atual,<\/li>\n<li>uma consulta para recuperar a postagem ap\u00f3s a postagem atual.<\/li>\n<\/ul>\n<p>Para este exemplo, estou assumindo que voc\u00ea tem acesso ao ID da postagem atual por meio da fun\u00e7\u00e3o <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>Obter uma postagem por tr\u00e1s da postagem atual<\/h3>\n<p>Para fazer isso, precisamos criar uma consulta simples que pegar\u00e1 uma postagem publicada do banco de dados do tipo de postagem especificada e que esteja relacionada \u00e0 posi\u00e7\u00e3o da postagem atual.<\/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\">Podemos fazer isso<\/a><\/strong> limitando o conjunto de resultados a um, ordenando os resultados em ordem decrescente e comparando o valor do ID do post:<\/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>Isso retornar\u00e1 uma s\u00e9rie de resultados que veremos como gerenciar daqui a pouco.<\/p>\n<h3>Obter a postagem ap\u00f3s a postagem atual<\/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\">Para o pr\u00f3ximo post<\/a><\/strong>, escrevemos uma consulta semelhante. Mas, em vez disso, procuramos o pr\u00f3ximo valor maior e \u00e0 frente do ID atual:<\/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>Agora precisamos de algumas fun\u00e7\u00f5es para determinar se as postagens existem. Podemos fazer isso com o array results que \u00e9 retornado.<\/p>\n<h3>Verificar se existe uma postagem<\/h3>\n<p>Observe 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\">no exemplo a seguir<\/a><\/strong>, a fun\u00e7\u00e3o aceita o array de resultados e simplesmente retorna se houver um post anterior. Os resultados que s\u00e3o passados \u200b\u200bpara esta fun\u00e7\u00e3o devem ser da consulta de postagem anterior acima.<\/p>\n<p>Em segundo lugar, observe que \u00e9 privado. Voc\u00ea pode querer tornar o seu p\u00fablico dependendo de como deseja construir seus modelos.<\/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>E ent\u00e3o, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-04-has-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">para o pr\u00f3ximo post,<\/a><\/strong> parece o mesmo, mas lembre-se de que os resultados que est\u00e3o sendo passados \u200b\u200bpara essa fun\u00e7\u00e3o s\u00e3o de uma consulta diferente.<\/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>E, finalmente, podemos usar essas fun\u00e7\u00f5es condicionais para obter o permalink.<\/p>\n<h3>Obtenha o link<\/h3>\n<p>Lembre-se, a maneira como voc\u00ea usa essa fun\u00e7\u00e3o pode variar do que a implementa\u00e7\u00e3o que forneci. Portanto, se voc\u00ea n\u00e3o precisar que seja privado, altere sua visibilidade e use-o em seu modelo conforme <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-05-get-post-link-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">necess\u00e1rio<\/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>Por fim, observe que esta fun\u00e7\u00e3o aceita os resultados que voc\u00ea passa para ela de qualquer consulta e recuperar\u00e1 a propriedade ID do primeiro \u00edndice dos resultados.<\/p>\n<p>Isso ocorre porque os resultados s\u00e3o limitados a um e se baseiam no uso das fun\u00e7\u00f5es condicionais. Ou seja, voc\u00ea pode fazer algo como:<\/p>\n<ul>\n<li>se houver uma pr\u00f3xima postagem, obtenha o link da pr\u00f3xima postagem<\/li>\n<\/ul>\n<p>Mas sua implementa\u00e7\u00e3o pode variar.<\/p>\n<h2>Por que isso \u00e9 necess\u00e1rio?<\/h2>\n<p>Pode n\u00e3o ser necess\u00e1rio. Isso \u00e9 tudo: se voc\u00ea estiver usando o WordPress pronto para uso com muito pouca personaliza\u00e7\u00e3o ou extens\u00e3o e n\u00e3o precisar fazer nada al\u00e9m do que ele pode fornecer, talvez voc\u00ea n\u00e3o precise disso.<\/p>\n<p>Se, por outro lado, voc\u00ea est\u00e1 procurando uma maneira de introduzir a funcionalidade de pagina\u00e7\u00e3o do WordPress em uma \u00fanica postagem, essa \u00e9 uma maneira de fazer isso que pode lidar adequadamente com o caso de postagens que s\u00e3o de um tipo de postagem espec\u00edfico, mas n\u00e3o t t\u00eam IDs sequenciais (e que funcionam apenas com um status de postagem de publica\u00e7\u00e3o).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao criar um aplicativo da Web, h\u00e1 nuances nas quais a funcionalidade nativa pode n\u00e3o funcionar. Voc\u00ea pode precisar de pagina\u00e7\u00e3o personalizada do WordPress.<\/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":[898,722,806,867],"tags":[1170],"class_list":["post-231264","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231264"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231264\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}