{"id":231211,"date":"2022-12-15T19:57:00","date_gmt":"2022-12-15T16:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231211"},"modified":"2022-12-07T11:39:16","modified_gmt":"2022-12-07T08:39:16","slug":"modelos-de-arquivo-personalizados-um-breve-guia","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/modelos-de-arquivo-personalizados-um-breve-guia\/","title":{"rendered":"Modelos de arquivo personalizados: um breve guia"},"content":{"rendered":"\n<p>Sempre que voc\u00ea estiver trabalhando com modelos de arquivo no WordPress, as postagens geralmente s\u00e3o listadas por data em ordem decrescente. Ou seja, as postagens mais recentes s\u00e3o listadas no topo e, a partir da\u00ed, segue.<\/p>\n<p>Ultimamente, tenho trabalhado em alguns projetos que se integram com APIs de terceiros. Essas APIs retornam datas \u2013 \u00e0s vezes duas datas, uma data de in\u00edcio e uma data de t\u00e9rmino \u2013 para um determinado evento e os clientes desejam usar essas informa\u00e7\u00f5es para listar postagens em vez da data da postagem. Ou seja, eles querem modelos de arquivo personalizados.<\/p>\n<p>N\u00e3o \u00e9 muito dif\u00edcil fazer isso, mas antes de fazer isso, acho importante fornecer algumas informa\u00e7\u00f5es b\u00e1sicas sobre como o projeto \u00e9 constru\u00eddo para que haja um pouco mais de contexto sobre por que, digamos, uma consulta personalizada \u00e9 necess\u00e1ria e por que voc\u00ea pode ou pode n\u00e3o precisa olhar em <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>Vou come\u00e7ar com um TL;DR primeiro, no entanto. Dessa forma, voc\u00ea pode ter a ideia antes de ler a coisa toda.<\/p>\n<h2>Modelos de arquivo personalizados<\/h2>\n<p>Ent\u00e3o o TL;DR por tr\u00e1s da coisa toda \u00e9 isso:<\/p>\n<ul>\n<li>as informa\u00e7\u00f5es de data fornecidas pela API de terceiros s\u00e3o mantidas na tabela de metadados post,<\/li>\n<li>a chave \u00e9 a data de in\u00edcio e o valor \u00e9 a data real,<\/li>\n<li>Ordeno o conte\u00fado em ordem decrescente e pelo valor meta.<\/li>\n<\/ul>\n<p>A pagina\u00e7\u00e3o pode ser um problema e, se voc\u00ea usar um tipo de postagem personalizado, precisar\u00e1 de alguns par\u00e2metros extras, mas essa \u00e9 a ideia geral.<\/p>\n<p>Agora para toda a configura\u00e7\u00e3o.<\/p>\n<h3>Tipos de postagem personalizados<\/h3>\n<p>Quando se trata de interface com APIs de terceiros, sou um grande f\u00e3 de tipos de postagem personalizados porque costumo pensar neles como um h\u00edbrido entre modelos e visualiza\u00e7\u00f5es.<\/p>\n<ul>\n<li>O componente de modelo inclui qualquer coisa que seja tangencialmente relacionada e possa ser gravada no banco de dados. Isso significa qualquer informa\u00e7\u00e3o de taxonomia ou meta-dados de postagem.<\/li>\n<li>O componente de visualiza\u00e7\u00e3o geralmente \u00e9 qualquer coisa que v\u00e1 para o modelo que possa alavancar quaisquer tags de modelo pr\u00e9-existentes, ou qualquer coisa que precise ser criada e que tamb\u00e9m leia informa\u00e7\u00f5es do banco de dados.<\/li>\n<\/ul>\n<p>Para este post, vou usar <strong>acme-event<\/strong> como o tipo de post personalizado.<\/p>\n<h3>Postar metadados<\/h3>\n<p>Eu defino as datas nos metadados do post e n\u00e3o no post em si, porque se algo acontecer no futuro e os dados forem definidos no pr\u00f3prio registro do post, o WordPress o tratar\u00e1 como um post <strong>agendado<\/strong> que n\u00e3o foi publicado .<\/p>\n<\/p>\n<p>Em vez disso, prefiro publicar a postagem e alterar a maneira como os metadados s\u00e3o exibidos no modelo.<\/p>\n<h3>Pagina\u00e7\u00e3o<\/h3>\n<p>O WordPress faz uma distin\u00e7\u00e3o sutil com a pagina\u00e7\u00e3o em sua base de c\u00f3digo. Ou seja, a vari\u00e1vel de consulta para sites sem uma p\u00e1gina inicial est\u00e1tica usa <strong>paged<\/strong> e o caso oposto usa <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=\"Modelos de arquivo personalizados: um breve guia\" ><\/a><\/p>\n<p>Isso \u00e9 importante quando voc\u00ea est\u00e1 construindo os argumentos para a consulta que vou abordar momentaneamente.<\/p>\n<h3>Arquivar apenas p\u00e1ginas<\/h3>\n<p>Lembre-se de que sempre que estiver introduzindo a pagina\u00e7\u00e3o, voc\u00ea s\u00f3 deseja alterar a consulta sempre que estiver na p\u00e1gina de arquivo real.<\/p>\n<p>Isso significa que voc\u00ea n\u00e3o se importa com casos em que est\u00e1 na \u00e1rea administrativa do WordPress e n\u00e3o deseja alterar a consulta para arquivos n\u00e3o personalizados do tipo post. Para esse fim, voc\u00ea deve certificar-se de que est\u00e1 configurando a vari\u00e1vel de consulta corretamente no retorno de chamada pre_get_posts.<\/p>\n<p>Observe que posso mostrar uma fun\u00e7\u00e3o de como fazer isso, mas por causa de como escrevemos c\u00f3digo no WordPress \u2013 ou seja, alguns escrevem c\u00f3digo procedural, outros escrevem c\u00f3digo orientado a objetos \u2013 vou simplesmente exibi-lo em c\u00f3digo procedural.<\/p>\n<h3>Juntando tudo<\/h3>\n<p>Primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vou construir a consulta:<\/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>Observe que no c\u00f3digo acima h\u00e1 um argumento para <strong>paged<\/strong>. Vou falar sobre o c\u00f3digo para isso momentaneamente.<\/p>\n<p>Em seguida, o modelo incluir\u00e1 todas as informa\u00e7\u00f5es que voc\u00ea optar por exibir. Estou optando por n\u00e3o compartilhar o c\u00f3digo do meu modelo neste post porque \u00e9 irrelevante para a ideia maior em quest\u00e3o.<\/p>\n<p>Al\u00e9m disso, voc\u00ea tem tudo o que precisa para exibir o conte\u00fado.<\/p>\n<p>Em seguida, definirei a pagina\u00e7\u00e3o. Primeiro, preciso fazer isso usando o gancho pre_get_posts para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">garantir que a vari\u00e1vel de consulta adequada esteja definida<\/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>Em seguida, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implementarei a pagina\u00e7\u00e3o<\/a> usando a consulta personalizada:<\/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>E depois disso, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vou redefinir a vari\u00e1vel global $post<\/a> usando wp_reset_postdata() caso alguma coisa da postagem original precise ser usada.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>Isso geralmente \u00e9 considerado uma boa limpeza sempre que voc\u00ea usa uma consulta personalizada.<\/p>\n<h3>Links \u00dateis<\/h3>\n<p>Abaixo est\u00e1 uma lista de fun\u00e7\u00f5es, p\u00e1ginas e refer\u00eancias que voc\u00ea pode achar \u00fateis no que se refere ao c\u00f3digo acima ou a qualquer trabalho futuro que voc\u00ea possa fazer.<\/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\">Pagina\u00e7\u00e3o<\/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>O <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c\u00f3digo completo<\/a> neste post.<\/li>\n<\/ul>\n<p>Se voc\u00ea trabalha com o WordPress h\u00e1 muito tempo, alguns deles podem parecer redundantes. Em outros casos, pode parecer novo ou pode esclarecer \u00e1reas das APIs do WordPress que voc\u00ea n\u00e3o sabia que existiam (pelo menos foi o meu caso).<\/p>\n<h2>Por que se incomodar com tudo isso?<\/h2>\n<p>Isso pode parecer um post longo para uma tarefa aparentemente simples, mas as informa\u00e7\u00f5es est\u00e3o um pouco espalhadas por toda a web no que se refere a fazer algo assim.<\/p>\n<p>Ent\u00e3o eu queria tentar juntar tudo isso com explica\u00e7\u00f5es, c\u00f3digo de exemplo e links para p\u00e1ginas que podem ser de interesse dependendo de como a implementa\u00e7\u00e3o \u00e9 feita.<\/p>\n<p>Afinal, muitos de n\u00f3s est\u00e3o usando o WordPress al\u00e9m do gerenciamento b\u00e1sico de conte\u00fado neste momento, mas isso n\u00e3o significa que n\u00e3o devemos aproveitar suas fun\u00e7\u00f5es e APIs integradas quando poss\u00edvel.<\/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>Considere este um curso intensivo na cria\u00e7\u00e3o de modelos de arquivo personalizados e todas as funcionalidades que os cercam.<\/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":[898,722,806,867],"tags":[1170],"class_list":["post-231211","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\/231211","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=231211"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231211\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}