{"id":231695,"date":"2022-12-27T12:20:00","date_gmt":"2022-12-27T09:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231695"},"modified":"2022-12-25T22:34:56","modified_gmt":"2022-12-25T19:34:56","slug":"consultas-de-banco-de-dados-para-atualizar-dados-rapidamente-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/consultas-de-banco-de-dados-para-atualizar-dados-rapidamente-parte-1\/","title":{"rendered":"Consultas de banco de dados para atualizar dados rapidamente, parte 1"},"content":{"rendered":"\n<p>Esta n\u00e3o \u00e9 a primeira vez que mencionei isso, mas um dos desafios que surgem ao falar sobre escrever consultas diretas ao banco de dados para atualizar informa\u00e7\u00f5es no banco de dados do WordPress \u00e9 que voc\u00ea se deixa aberto a algo como:<\/p>\n<blockquote>\n<p>Sim, mas h\u00e1 uma API para fazer algo assim.<\/p>\n<\/blockquote>\n<p>E, em muitos casos, isso mesmo. Eu sou um grande f\u00e3 de us\u00e1-los tamb\u00e9m. Mas h\u00e1 momentos em que consultas diretas e parametrizadas ao banco de dados podem ser uma escolha mais ideal.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159831-61e6fe995df5b.jpg\" 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-159831-61e6fe995df5b.jpg\" alt=\"Consultas de banco de dados para atualizar dados rapidamente, parte 1\" ><\/a><\/p>\n<p>N\u00e3o, n\u00e3o \u00e9 um banco de dados, mas n\u00e3o seria incr\u00edvel se eles fossem assim? Foto de Tobias Fischer no Unsplash<\/p>\n<p>Isso, \u00e9 claro, depende do ambiente no qual voc\u00ea est\u00e1 trabalhando com os requisitos do seu projeto.<\/p>\n<p>Portanto, este \u00e9 mais um post que ser\u00e1 uma ilustra\u00e7\u00e3o de como usar <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> para atualizar informa\u00e7\u00f5es rapidamente com base em metadados (sem usar algo como <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> ou <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a> para lidar com isso).<\/p>\n<h2>Consultas de banco de dados para atualizar dados rapidamente, parte 1<\/h2>\n<p>Vou dividir isso em duas partes porque a fun\u00e7\u00e3o inicial que vou mostrar a voc\u00ea est\u00e1 fazendo mais de uma coisa.<\/p>\n<p>Eu n\u00e3o sou f\u00e3 disso.<\/p>\n<p>Em segundo lugar, \u00e9 tamb\u00e9m uma oportunidade de como voc\u00ea pode redesenhar fun\u00e7\u00f5es para se comportarem de uma maneira mais orientada a objetos (que \u00e9 algo que <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sou f\u00e3<\/a> e do qual <a href=\"https:\/\/tommcfarlin.com\/object-oriented-programming-using-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">estou sempre feliz em promover<\/a> ).<\/p>\n<p>Por enquanto, por\u00e9m, deixe-me expor o problema em quest\u00e3o<\/p>\n<ol>\n<li>Estou importando um pouco de informa\u00e7\u00e3o de uma API de terceiros.<\/li>\n<li>As informa\u00e7\u00f5es s\u00e3o mapeadas para a tabela wp_posts e tamb\u00e9m para a tabela wp_postmeta.<\/li>\n<li>Existem certos metadados que s\u00e3o crit\u00e9rios para ditar o status de uma postagem. Ou, mais diretamente, se um peda\u00e7o de metadados estiver presente, uma postagem deve ter seu status de postagem definido como rascunho para que n\u00e3o apare\u00e7a na consulta principal.<\/li>\n<\/ol>\n<p>Para resolver isso, duas coisas precisam acontecer:<\/p>\n<ol>\n<li>Precisamos dos IDs das postagens,<\/li>\n<li>E precisamos mudar o status das postagens.<\/li>\n<\/ol>\n<p>Antes de configurarmos as consultas e o restante do c\u00f3digo, digamos que a meta-chave que estamos usando seja criativamente chamada <strong>acme-status<\/strong>. E com isso, vamos come\u00e7ar.<\/p>\n<h3>1 Pegue os IDs de postagem com a meta-chave associada<\/h3>\n<p>Primeiro, vamos criar uma fun\u00e7\u00e3o chamada <strong>setInactivePosts.<\/strong> Isso \u00e9 mais gen\u00e9rico do que seria se voc\u00ea estivesse trabalhando em um dom\u00ednio espec\u00edfico, mas voc\u00ea entendeu.<\/p>\n<p>Em seguida, vamos configurar uma consulta que <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-00-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">recuperar\u00e1 todos os IDs de postagem que possuem essa meta-chave espec\u00edfica<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            'acme-status') );\n\n  \/\/ More to come...\n<\/code><\/pre>\n<p>Aqui, temos uma s\u00e9rie de resultados. Mas antes de fazermos qualquer coisa, precisamos ter certeza de que temos dados para operar.<\/p>\n<h3>2 Sair mais cedo?<\/h3>\n<p>Antes de prosseguirmos com a atualiza\u00e7\u00e3o das informa\u00e7\u00f5es, por\u00e9m, devemos verificar se h\u00e1 algum resultado. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-01-return-early-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">E se n\u00e3o houver?<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ If there aren't any results, there's nothing to do.\nif (0 === count($results)) {\n    return;\n}\n\n\/\/ More to come...<\/code><\/pre>\n<p>Ent\u00e3o podemos nos esquivar.<\/p>\n<h3>3 Atualizar o status da postagem<\/h3>\n<p>Mas se houver resultados, devemos iterar por eles e atualizar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-02-update-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seu status de postagem<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\nforeach ($results as $result) {\n    $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            UPDATE $wpdb-&gt;posts\n            SET post_status = %s\n            WHERE ID = %d\n            \",\n            'draft',\n            (int) ($result-&gt;post_id)) );\n}<\/code><\/pre>\n<p>Ent\u00e3o, como \u00e9 tudo junto?<\/p>\n<h3>4 Todos Juntos<\/h3>\n<p>Quando juntamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-03-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">essa fun\u00e7\u00e3o maior do que o necess\u00e1rio, \u00e9 isso que voc\u00ea v\u00ea<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            'acme-status') );\n\n    \/\/ If there aren't any results, there's nothing to do.\n    if (0 === count($results)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    foreach ($results as $result) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($result-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Mas no pr\u00f3ximo post, vamos reorganizar isso um pouco para torn\u00e1-lo mais orientado a objetos.<\/p>\n<h3>Uma observa\u00e7\u00e3o para administradores de banco de dados<\/h3>\n<p>Para aqueles de voc\u00eas s\u00e3o bem versados \u200b\u200bem SQL-fu, ent\u00e3o voc\u00ea sabe que isso provavelmente pode ser resolvido em uma \u00fanica consulta; no entanto, o objetivo deste post e do post seguinte \u00e9 duplo:<\/p>\n<ol>\n<li>Para mostrar como usar $wpdb para conseguir algo rapidamente,<\/li>\n<li>Mostrar como quebrar um m\u00e9todo procedural de fazer algo em um m\u00e9todo orientado a objetos de fazer algo.<\/li>\n<\/ol>\n<p>Dito isso, obrigado por todas as perguntas. \ud83d\udc4d\ud83c\udffb<\/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>Este \u00e9 mais um post que ser\u00e1 uma ilustra\u00e7\u00e3o de como usar $wpdb para atualizar informa\u00e7\u00f5es rapidamente usando consultas diretas ao banco de dados.<\/p>\n","protected":false},"author":1,"featured_media":237054,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,837,920,846,867],"tags":[1170],"class_list":["post-231695","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-outro","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231695","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=231695"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231695\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/237054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}