{"id":233945,"date":"2023-02-25T10:41:00","date_gmt":"2023-02-25T07:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233945"},"modified":"2022-11-11T13:20:03","modified_gmt":"2022-11-11T10:20:03","slug":"tutorial-de-tema-wordpress-para-iniciantes-parte-12-consulta-de-postagem-personalizada","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/tutorial-de-tema-wordpress-para-iniciantes-parte-12-consulta-de-postagem-personalizada\/","title":{"rendered":"Tutorial de Tema WordPress para Iniciantes \u2013 Parte 12: Consulta de postagem personalizada"},"content":{"rendered":"\n<p>Nesta li\u00e7\u00e3o final, aprendemos como escrever sua pr\u00f3pria consulta de postagens e fazer um loop por elas sem interromper o loop pai no modelo. Faremos uma parte de modelo para postagens \u00fanicas que mostre postagens relacionadas na mesma categoria.<\/p>\n<p>O que faremos nesta li\u00e7\u00e3o \u00e9 uma consulta de postagens relacionadas em nossa visualiza\u00e7\u00e3o de postagem \u00fanica, mostrando no m\u00e1ximo 3 postagens, do tipo postagem, na mesma categoria ou categorias da postagem em que estamos, exclua a postagem atual em si, e randomize os posts mostrados. Tamb\u00e9m veremos estrat\u00e9gias para n\u00e3o atrapalhar o loop aninhado.<\/p>\n<h2>Modelo de postagens relacionadas<\/h2>\n<p>Vamos fazer das postagens relacionadas uma parte do modelo, sobre a qual aprendemos na <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\">parte 10<\/a>. Dessa forma, n\u00e3o complicamos demais <code>single.php<\/code>e tornamos nosso c\u00f3digo mais reutiliz\u00e1vel. Coloque o pedido desta nova pe\u00e7a de modelo onde desejar. Vou coloc\u00e1-lo logo antes de solicitar o modelo de coment\u00e1rios:<\/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>Agora, vamos criar um novo arquivo vazio em nossa pasta de temas e nome\u00e1-lo <code>related-posts.php<\/code>. Com este arquivo, estamos prontos para mergulhar na cria\u00e7\u00e3o de uma consulta de postagem personalizada.<\/p>\n<h2>Consulta de postagem personalizada<\/h2>\n<p>Se voc\u00ea quiser fazer uma consulta personalizada de posts, tem algumas op\u00e7\u00f5es, mas recomendo se acostumar com a classe <code>WP_Query<\/code>. Marque <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta p\u00e1gina de documenta\u00e7\u00e3o<\/a> como favorita, pois voc\u00ea a consultar\u00e1 com frequ\u00eancia, pois h\u00e1 muitas op\u00e7\u00f5es. Mostrarei um exemplo pr\u00e1tico de como configurar uma consulta consultando a documenta\u00e7\u00e3o de cada especifica\u00e7\u00e3o que desejamos adicionar.<\/p>\n<p>Se voc\u00ea quiser saber mais sobre como consultar posts, eu <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tenho um post<\/a> que detalha exatamente isso.<\/p>\n<p>Para fazer uma p\u00f3s-consulta personalizada, chamaremos <code>new WP_Query()<\/code>, passaremos um array de argumentos para ela e armazenaremos seu resultado em uma vari\u00e1vel. E ent\u00e3o usaremos exatamente o mesmo loop que usamos antes em nossos modelos (d\u00ea uma <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\">olhada no loop original aqui<\/a> para comparar). Mas precisamos dizer ao loop para passar pela vari\u00e1vel, em vez da global (que \u00e9 o post \u00fanico).<\/p>\n<p>\u00c9 assim que o loop ficar\u00e1 ao adicion\u00e1-lo a uma consulta personalizada:<\/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>Como voc\u00ea pode ver, o loop \u00e9 exatamente o mesmo, usando <code>have_posts<\/code>and <code>the_post<\/code>. A diferen\u00e7a \u00e9 que n\u00f3s os chamamos para o <code>$related_posts<\/code>objeto. Se pularmos a <code>$related_posts<\/code>parte, o WordPress automaticamente assume que \u00e9 a consulta global de postagens.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode notar a chamada da fun\u00e7\u00e3o <code>wp_reset_postdata()<\/code>logo ap\u00f3s o loop. \u00c9 assim que &quot;limpamos depois de n\u00f3s mesmos&quot; depois de uma consulta personalizada com <code>WP_Query<\/code>. Lembre-se que <code>the_post()<\/code>configura o objeto global post para que possamos usar <code>the_title()<\/code>etc. E como j\u00e1 estamos dentro de um loop (o de <code>single.php<\/code>), precisamos ter certeza n\u00f3s limpamos e redefinimos a postagem de volta para a postagem \u00fanica depois de terminarmos. Se n\u00e3o redefinirmos os postdata, qualquer coisa depois disso se referir\u00e1 \u00e0 \u00faltima postagem relacionada que passamos. Isso pode ser um grande problema! Em nosso exemplo, tem um modelo de coment\u00e1rios que segue isso. Deixar de fora a redefini\u00e7\u00e3o far\u00e1 com que o modelo de coment\u00e1rio mostre coment\u00e1rios do \u00faltimo post relacionado no loop. E n\u00e3o o \u00fanico post que estamos vendo!<\/p>\n<h3>Implementando nosso loop personalizado<\/h3>\n<p>Tudo bem, vamos come\u00e7ar a implementar o loop personalizado em nosso <code>related-posts.php<\/code>. Eu adicionei um wrapper e um t\u00edtulo, mas como de costume voc\u00ea pode ajustar o HTML como desejar:<\/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>Agora veremos o poder da reutiliza\u00e7\u00e3o nas partes do modelo. Digamos que dentro desse loop personalizado queremos mostrar exatamente o mesmo conte\u00fado que fazemos em nosso <code>content-loop.php<\/code>, que usamos em nossos modelos de arquivo. Tudo o que precisamos fazer \u00e9 solicitar essa parte do modelo dentro de nosso loop personalizado, se estamos prontos para lidar com a sa\u00edda de cada postagem!<\/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>Agora tudo o que resta \u00e9 adicionar os argumentos \u00e0 nossa consulta de postagem, certificando-se de buscar o que queremos. Vamos analisar os argumentos um por um.<\/p>\n<h2>Criando os argumentos para nossa consulta de postagem personalizada<\/h2>\n<p>N\u00e3o queremos buscar mais posts do que 3. Na documenta\u00e7\u00e3o (se\u00e7\u00e3o &#8220;Par\u00e2metros de pagina\u00e7\u00e3o&quot;) o argumento para isso \u00e9 <code>posts_per_page<\/code>. Ent\u00e3o adicionamos o elemento array:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Queremos garantir que o WordPress busque posts, e n\u00e3o p\u00e1ginas ou qualquer outra coisa. Em &#8220;Par\u00e2metros de tipo de postagem&#8221; encontramos:<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Queremos evitar que a \u00fanica postagem em que estamos apare\u00e7a em nossa consulta de postagens relacionadas, porque isso n\u00e3o faz sentido, certo? A documenta\u00e7\u00e3o nos diz em &#8220;Par\u00e2metros de postagem e p\u00e1gina&#8221; que podemos adicionar o ID da postagem em uma matriz para <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Tamb\u00e9m queremos randomizar as postagens; porque, por padr\u00e3o, ele buscar\u00e1 as \u00faltimas postagens publicadas e isso pode rapidamente se tornar bastante repetitivo \u00e0 medida que voc\u00ea passa pelas postagens. Felizmente o WordPress tem uma fun\u00e7\u00e3o para isso na forma como ordena os posts; em &#8220;Ordenar e ordenar por par\u00e2metros&#8221; encontramos:<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Por fim, queremos consultar postagens que estejam dentro das mesmas categorias da postagem em que estamos. Para fazer isso, precisamos primeiro, antes dos argumentos da consulta, obter as categorias para o \u00fanico post em que estamos. Em &#8220;Par\u00e2metros de categoria&#8221; vemos que podemos fornecer uma matriz de IDs de categoria para <code>category__in<\/code>. Felizmente, o WordPress tem uma fun\u00e7\u00e3o para obter IDs de categoria para um post; <code>wp_get_post_categories()<\/code>que podemos usar diretamente como valor para o par\u00e2metro. Perfeito!<\/p>\n<p>Aqui est\u00e1 a consulta final e seus argumentos:<\/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>Atualize e voc\u00ea ver\u00e1 3 postagens listadas na parte inferior da visualiza\u00e7\u00e3o \u00fanica. Atualize v\u00e1rias vezes para ver que eles mudam porque dissemos ao WordPress para randomiz\u00e1-los. Nota: Se voc\u00ea tiver menos de 3 postagens na mesma categoria, receber\u00e1 menos de 3 postagens.<\/p>\n<p>\u00c9 isso! Agora voc\u00ea sabe como consultar as postagens que desejar. A <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina de documenta\u00e7\u00e3o WP_Query<\/a> \u00e9 extremamente \u00fatil para ajustar sua consulta, porque h\u00e1 possibilidades realmente ilimitadas aqui. Eu encorajo voc\u00ea a brincar com os par\u00e2metros e talvez tentar fazer uma parte de modelo separada para usar em posts relacionados.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesta li\u00e7\u00e3o de tema do WordPress, voc\u00ea aprende como escrever sua pr\u00f3pria consulta de postagens e fazer um loop por elas sem interromper o loop pai no modelo.<\/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":[930,898,898,722,722,837,920,1110,920,837,930,846,846,867,867],"tags":[1170],"class_list":["post-233945","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-assuntos","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-outro","category-n-a","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233945","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=233945"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233945\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233945"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233945"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233945"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}