{"id":233916,"date":"2023-02-24T11:08:00","date_gmt":"2023-02-24T08:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233916"},"modified":"2022-11-11T13:09:38","modified_gmt":"2022-11-11T10:09:38","slug":"guia-como-consultar-postagens-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/guia-como-consultar-postagens-no-wordpress\/","title":{"rendered":"Guia: Como consultar postagens no WordPress"},"content":{"rendered":"\n<p>Quais m\u00e9todos est\u00e3o dispon\u00edveis para fazer uma consulta de postagem personalizada e quando \u00e9 melhor us\u00e1-los? Este post visa estabelecer uma compreens\u00e3o s\u00f3lida de dois m\u00e9todos de consulta de postagens, como acessar os resultados, como construir argumentos e, finalmente, como limpar depois. Os dois m\u00e9todos que veremos s\u00e3o <code>get_posts()<\/code>e <code>WP_Query<\/code>.<\/p>\n<p>Quando se trata de fazer uma nova consulta de postagem, existem realmente duas op\u00e7\u00f5es (no momento da reda\u00e7\u00e3o). A escolha realmente depende da sua prefer\u00eancia (e de algum efeito menor no desempenho). Uma op\u00e7\u00e3o tem o potencial de atrapalhar o loop\/consulta global em que voc\u00ea est\u00e1 atualmente, a menos que voc\u00ea a manipule corretamente. Com uma op\u00e7\u00e3o voc\u00ea manipula objetos e na outra op\u00e7\u00e3o voc\u00ea manipula um array. Os argumentos para personalizar a consulta de postagem s\u00e3o, no entanto, id\u00eanticos.<\/p>\n<h2>Consulta global?<\/h2>\n<p>Se voc\u00ea n\u00e3o tiver certeza do que quero dizer com &quot;estragar a consulta global&quot;, \u00e9 isso. O WordPress sempre faz uma consulta global, dependendo da p\u00e1gina em que voc\u00ea est\u00e1. Se um visitante visitar um arquivo de categoria, o WordPress fez uma consulta de postagem para isso O tema normalmente acessaria os posts da consulta usando o &#8220;loop&quot; Quando fazemos uma nova consulta com seu pr\u00f3prio loop dentro desse loop, precisamos garantir que a consulta global do WordPress e nossa consulta sejam tratadas separadamente.<\/p>\n<p>No entanto, se voc\u00ea deseja modificar a consulta de postagem do WordPress, isso \u00e9 outra hist\u00f3ria. Eu tenho <a href=\"http:\/\/awhitepixel.com\/blog\/modifying-wordpress-global-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">outro post<\/a> que se aprofunda sobre como fazer isso.<\/p>\n<p>Vejamos as duas op\u00e7\u00f5es que temos e como lidamos com elas. Depois disso, veremos os argumentos para personalizar a consulta. Tenha em mente que os argumentos s\u00e3o id\u00eanticos para ambos.<\/p>\n<h2><strong>Os dois m\u00e9todos de consulta de postagens<\/strong><\/h2>\n<p>Voc\u00ea pode consultar posts com a fun\u00e7\u00e3o <code>get_posts()<\/code>ou fazendo uma nova inst\u00e2ncia de <code>WP_Query.<\/code>A primeira op\u00e7\u00e3o retorna um array de posts e na segunda voc\u00ea manipula um objeto. Como <code>get_posts()<\/code>retorna uma matriz apenas das postagens, geralmente \u00e9 mais simples usar isso em qualquer lugar que voc\u00ea desejar. No entanto, se voc\u00ea deseja paginar sua consulta, definitivamente deve criar uma <code>WP_Query<\/code>inst\u00e2ncia.<\/p>\n<p>A fun\u00e7\u00e3o <code>get_posts<\/code>\u00e9 uma fun\u00e7\u00e3o wrapper, o <code>WP_Query<\/code>que significa que ela aceita os mesmos argumentos, mas <code>get_posts<\/code>tem alguns argumentos &#8220;alias&#8221; adicionais. A p\u00e1gina de documenta\u00e7\u00e3o do WordPress para <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_posts<\/a> n\u00e3o lista os argumentos poss\u00edveis (exceto os argumentos de alias), mas se refere \u00e0 p\u00e1gina de documenta\u00e7\u00e3o para <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> para os argumentos. Veremos mais de perto os argumentos mais adiante.<\/p>\n<p>Se o desempenho \u00e9 um problema (ou seja, o site tem muitos posts), <code>get_posts<\/code>\u00e9 mais r\u00e1pido do que usar <code>WP_Query<\/code>porque pula o c\u00e1lculo para pagina\u00e7\u00e3o.<\/p>\n<p>O m\u00e9todo de percorrer sua consulta de postagem personalizada difere dependendo do m\u00e9todo escolhido. Voc\u00ea deve estar familiarizado com o loop comum do WordPress usado em quase todos os modelos de tema:<\/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>Loop usando WP_Query<\/strong><\/h3>\n<p>Fazer um loop dos resultados de using <code>WP_Query<\/code>\u00e9 exatamente o mesmo, exceto que nos referimos especificamente ao objeto de inst\u00e2ncia no loop. Tamb\u00e9m precisamos nos lembrar de &#8220;redefinir o estado&#8221; depois que terminarmos o loop para que o objeto global post volte ao que era antes. Para isso usamos <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>Se voc\u00ea despejar o objeto instanciado por <code>WP_Query<\/code>( <code>$custom_query<\/code>no exemplo acima), voc\u00ea encontrar\u00e1 a consulta completa e os argumentos usados. As partes interessantes aqui s\u00e3o as propriedades &#8216; <code>found_posts<\/code>&#8216; e &#8216; <code>posts<\/code>&#8216;. A <code>posts<\/code>propriedade &#8216; &#8216; cont\u00e9m o resultado dos objetos post pelos quais o loop ser\u00e1 executado. O n\u00famero de postagens que corresponderam \u00e0 sua consulta \u00e9 retornado em &#8216; <code>found_posts<\/code>&#8216; e \u00e9 \u00fatil se voc\u00ea deseja fazer uma pagina\u00e7\u00e3o personalizada. Divida este valor com a configura\u00e7\u00e3o do WordPress para o n\u00famero de posts por p\u00e1gina para descobrir quantas p\u00e1ginas voc\u00ea precisa para sua consulta, ou simplesmente consulte a propriedade &#8216; <code>max_num_pages<\/code>&#8216;.<\/p>\n<p>Nota: Quando voc\u00ea usa o <code>get_posts<\/code>WordPress retorna apenas a <code>posts<\/code>propriedade &#8216; &#8216; (que \u00e9 um array) do <code>WP_Query<\/code>objeto.<\/p>\n<h3><strong>Loop usando get_posts<\/strong><\/h3>\n<p>Ao usar <code>get_posts<\/code>, n\u00e3o usamos o usual &#8220;loop do WordPress&#8221;, em vez disso, usamos um loop de array PHP normal. Cada elemento no array s\u00e3o objetos post, e nenhuma redefini\u00e7\u00e3o \u00e9 necess\u00e1ria depois que voc\u00ea terminar o loop. Tenha em mente que as tags de modelo (como <code>the_title()<\/code>, <code>the_permalink()<\/code>etc) n\u00e3o est\u00e3o dispon\u00edveis dentro deste loop. Voc\u00ea precisar\u00e1 consultar as propriedades do objeto post (por exemplo <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>Eu recomendo que voc\u00ea nomeie seus objetos de postagem com algo diferente de <code>$post<\/code>. Voc\u00ea pode encontrar problemas ao tentar acessar as propriedades do post (pode se referir ao objeto global do post e n\u00e3o ao post no loop).<\/p>\n<p>Se voc\u00ea quiser usar <a href=\"https:\/\/codex.wordpress.org\/Template_tags#Post_tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tags de modelo<\/a> para facilitar o acesso \u00e0s informa\u00e7\u00f5es da postagem (como <code>the_title()<\/code>e <code>the_permalink()<\/code>), poder\u00e1 faz\u00ea-lo. Fa\u00e7a isso dizendo ao WordPress para configurar o objeto de postagem global dentro do loop com <code>setup_postdata()<\/code>. Se voc\u00ea fizer isso, precisar\u00e1 redefinir o estado <code>wp_reset_postdata()<\/code>ap\u00f3s o loop.<\/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>Tenha em mente que <code>setup_postdata<\/code>requer que os objetos pelos quais voc\u00ea est\u00e1 fazendo o loop (a <code>as<\/code>parte &#8221; &#8221; no loop foreach) sejam nomeados <code>$post<\/code>! No primeiro exemplo eu nomeei os objetos post <code>$custom_post<\/code>e isso n\u00e3o funcionaria com <code>setup_postdata()<\/code>.<\/p>\n<p>No entanto, se voc\u00ea s\u00f3 precisa de acesso \u00e0s informa\u00e7\u00f5es b\u00e1sicas do post, voc\u00ea pode pular a configura\u00e7\u00e3o do objeto global do post e usar as <code>get_<\/code>tags &quot; &quot;-template correspondentes e o ID do post. Por exemplo, a tag <code>the_permalink()<\/code>s\u00f3 funciona corretamente se o objeto de postagem global estiver configurado, mas voc\u00ea pode solicitar o link permanente de postagem sem o objeto de postagem global simplesmente usando <code>echo get_the_permalink($custom_post-&gt;ID)<\/code>.<\/p>\n<h2><strong>Argumentos da consulta<\/strong><\/h2>\n<p>Voc\u00ea pode encontrar a lista completa de todos os argumentos poss\u00edveis na <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina de documenta\u00e7\u00e3o do WP_Query<\/a>. Exemplos de par\u00e2metros s\u00e3o postagens com termo(s) espec\u00edfico(s) de uma taxonomia, meta valores de postagem, tipos de postagem, inclus\u00e3o ou exclus\u00e3o de postagens espec\u00edficas e toda uma gama de op\u00e7\u00f5es para ordenar os resultados. H\u00e1 muitos para analisar cada um em detalhes, mas aqui est\u00e3o alguns exemplos comuns de argumentos para consultar postagens.<\/p>\n<h3>Exemplo 1: postagens relacionadas da mesma categoria<\/h3>\n<p>Digamos que voc\u00ea queira mostrar &#8220;posts relacionados&#8221; no final de um \u00fanico post. Deve mostrar uma sele\u00e7\u00e3o aleat\u00f3ria de 3 posts que est\u00e3o na mesma categoria do post atual e deve excluir o post atual do resultado.<\/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>Os argumentos s\u00e3o bastante autoexplicativos. Pe\u00e7o apenas &#8216; <code>post<\/code>&#8216; em &#8216; <code>post_type<\/code>e no m\u00e1ximo 3 posts em &#8216; <code>posts_per_page'<\/code>.<\/p>\n<p>Para consultar posts em categorias, voc\u00ea pode construir uma <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 usar o mais simples &#8216; <code>category__in<\/code>&#8216; (NB: S\u00f3 funciona para categoria de post). No exemplo acima eu uso <code>wp_get_post_categories()<\/code>para obter uma matriz de IDs de termo atribu\u00eddos ao post fornecido e uso isso para o argumento &#8216; <code>category__in<\/code>&#8216;.<\/p>\n<p>Voc\u00ea pode excluir IDs de postagem com &#8216; <code>post__not_in<\/code>&#8216; enquanto eu forneci o ID de postagem atual. Por fim, pedi uma ordem aleat\u00f3ria de posts configurando &#8216; <code>rand<\/code>&#8216;em&#8217; <code>orderby<\/code>&#8216;. Voc\u00ea pode fornecer, por exemplo, &#8216; <code>title<\/code>&#8216; ou &#8216; <code>date<\/code>&#8216; para orden\u00e1-los de maneira diferente. D\u00ea uma olhada na <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#order-orderby-parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o para encomendar<\/a> para ver o que \u00e9 poss\u00edvel.<\/p>\n<h3>Exemplo 2: todas as postagens de um tipo de postagem personalizado com v\u00e1rios argumentos de ordena\u00e7\u00e3o<\/h3>\n<p>Neste exemplo, assumimos que voc\u00ea tem um tipo de postagem personalizado &#8216; <code>book<\/code>&#8216; e em um modelo de p\u00e1gina personalizado voc\u00ea deseja exibir todos os livros publicados. Voc\u00ea deseja ordenar as postagens principalmente por menu_order (o atributo da p\u00e1gina, \u00e9 um n\u00famero que voc\u00ea pode definir por postagem) e, em segundo lugar, pelo t\u00edtulo da postagem.<\/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>Novamente, os argumentos s\u00e3o bastante autoexplicativos. Solicito o tipo de postagem &#8216; <code>book<\/code>&#8216; como &#8216; <code>post_type<\/code>&#8216;. Quando voc\u00ea definir &#8216; <code>posts_per_page<\/code>&#8216; para -1 ele ir\u00e1 buscar todos (posts publicados, a menos que voc\u00ea especifique algo diferente no <code>post_status<\/code>argumento &#8216; ). Finalmente, forne\u00e7o um array para &#8216; <code>orderby<\/code>&#8216; para dizer ao WordPress para classificar as postagens principalmente por ordem de menu em ordem crescente e, em segundo lugar, t\u00edtulo de postagem em ordem decrescente.<\/p>\n<h3>Exemplo 3: postagens com metadados personalizados<\/h3>\n<p>Vamos supor que voc\u00ea tenha um tipo de postagem personalizado &#8216; <code>book<\/code>&#8216; e deseja consultar todos os livros in\u00e9ditos ou um livro publicado entre os anos de 1990 e 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>Construir uma consulta usando post meta \u00e9 melhor feito com <code>meta_query<\/code>(para argumentos meta muito simples, voc\u00ea pode usar <code>meta_key<\/code>e <code>meta_value<\/code>diretamente). O <code>meta_query<\/code>argumento &#8216; &#8216; requer um array, onde cada argumento \u00e9 um array. Voc\u00ea pode controlar a rela\u00e7\u00e3o entre cada argumento com &#8216; <code>relation<\/code>&#8216;, que eu configurei para &#8216; <code>OR<\/code>&#8216; no exemplo acima.<\/p>\n<p>Eu forne\u00e7o dois argumentos de metadados para &#8216; <code>meta_query<\/code>&#8216;. A primeira simplesmente compara a meta-chave &#8216; <code>book_status<\/code>&#8216; com o texto &#8216; <code>unpublished<\/code>, e se for igual ela ser\u00e1 inclu\u00edda. No segundo argumento eu digo ao WordPress para obter qualquer valor na meta-chave &#8216; <code>year_published<\/code>&#8216; que esteja entre os n\u00fameros 1990 e 2019.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Agora voc\u00ea deve ter uma compreens\u00e3o b\u00e1sica dos dois m\u00e9todos de consulta de postagens. N\u00e3o h\u00e1 uma grande diferen\u00e7a, pois voc\u00ea pode criar a mesma consulta usando os dois, mas a maneira de lidar com os dois \u00e9 diferente. Os tr\u00eas exemplos fornecidos de argumentos de consulta apenas tocam na superf\u00edcie de quais consultas voc\u00ea pode criar. Consulte a <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o do WP_Query<\/a> para obter uma vis\u00e3o geral completa com muitos exemplos.<\/p>\n<p>Se voc\u00ea est\u00e1 curioso sobre como modificar a consulta global que o WordPress executa, tenho um <a href=\"http:\/\/awhitepixel.com\/blog\/modifying-wordpress-global-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post separado<\/a> detalhando isso.<\/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>Neste guia, veremos dois m\u00e9todos de consulta de posts no WordPress (get_posts e WP_Query), como acessar cada post e construir argumentos.<\/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":[930,898,898,722,722,920,1110,920,806,806,930,846,846,867,867],"tags":[1170],"class_list":["post-233916","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-assuntos","category-codigo-2","category-desenvolvedor","category-outro","category-n-a","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233916","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=233916"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233916\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224094"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}