{"id":231713,"date":"2022-12-27T11:53:00","date_gmt":"2022-12-27T08:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231713"},"modified":"2022-12-27T12:22:24","modified_gmt":"2022-12-27T09:22:24","slug":"consultas-de-banco-de-dados-para-atualizar-dados-rapidamente-parte-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/consultas-de-banco-de-dados-para-atualizar-dados-rapidamente-parte-2\/","title":{"rendered":"Consultas de banco de dados para atualizar dados rapidamente, parte 2"},"content":{"rendered":"\n<p>Esta \u00e9 a segunda e \u00faltima parte de uma s\u00e9rie sobre \u2013 como o t\u00edtulo sugere \u2013 consultas diretas ao banco de dados. Especificamente, trata-se de alterar os status das postagens (mas \u00e9 relevante para mais do que isso).<\/p>\n<p>Foto de Ross Findon no Unsplash<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/consultas-de-banco-de-dados-para-atualizar-dados-rapidamente-parte-1\/\" title=\"Do post anterior:\">Do post anterior:<\/a><\/p>\n<blockquote>\n<p>Este \u00e9 mais um post que ser\u00e1 uma ilustra\u00e7\u00e3o de como usar $wpdb para atualizar rapidamente informa\u00e7\u00f5es com base em metadados.<\/p>\n<\/blockquote>\n<p>E o c\u00f3digo fornecido nessa postagem funciona, mas se voc\u00ea deseja torn\u00e1-lo mais orientado a objetos, h\u00e1 mais trabalho a ser feito.<\/p>\n<p>Antes de pular para o post real, por\u00e9m, \u00e9 importante observar que quando se trata de programa\u00e7\u00e3o orientada a objetos, h\u00e1 muito trabalho que pode ser feito no design de classes e na cria\u00e7\u00e3o de n\u00edveis de abstra\u00e7\u00e3o.<\/p>\n<p>Em algum ponto, voc\u00ea tem que tra\u00e7ar a linha proverbial entre quando voc\u00ea vai usar interfaces, qu\u00e3o granular suas classes v\u00e3o ser em termos do que elas est\u00e3o abstraindo e coisas do g\u00eanero.<\/p>\n<p>E o objetivo deste post \u00e9 ajudar a fornecer um design orientado a objetos melhor, mas n\u00e3o \u00e9 um exerc\u00edcio fazer isso o melhor poss\u00edvel. Eu discuto t\u00f3picos como este em <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">outra s\u00e9rie de posts<\/a>.<\/p>\n<p>Mas tenha isso em mente ao ler o c\u00f3digo ao longo do restante do post.<\/p>\n<h2>Consultas de banco de dados para atualizar dados rapidamente, parte 2<\/h2>\n<p>Dado onde paramos, temos uma \u00fanica fun\u00e7\u00e3o fazendo as seguintes coisas:<\/p>\n<ol>\n<li>recuperar todas as postagens associadas a uma meta-chave espec\u00edfica,<\/li>\n<li>determinar se precisamos sair mais cedo,<\/li>\n<li>atualizar o status de postagem de quaisquer postagens existentes.<\/li>\n<\/ol>\n<p>A primeira coisa a notar \u00e9 que uma \u00fanica fun\u00e7\u00e3o \u00e9 demais, ent\u00e3o ela precisa ser dividida em v\u00e1rias outras fun\u00e7\u00f5es. E como \u00e9 orientada a objetos, precisamos ter certeza de que tudo o que uma fun\u00e7\u00e3o est\u00e1 fazendo n\u00e3o \u00e9 necessariamente baseado em etapas anteriores \u2013 \u00e9 exatamente disso que trata a programa\u00e7\u00e3o procedural.<\/p>\n<p>Em vez disso, usaremos essa oportunidade para configurar fun\u00e7\u00f5es, para que elas operem em qualquer dado que seja passado a elas, independentemente de como chegaram l\u00e1.<\/p>\n<p>Finalmente, cabe a voc\u00ea, como desenvolvedor, determinar se deseja ter uma \u00fanica classe para fazer isso, mais de uma classe ou ter um conjunto de classes relacionadas herdadas de uma classe pai.<\/p>\n<p>Novamente, trata-se de qu\u00e3o abstrato voc\u00ea deseja tornar o c\u00f3digo.<\/p>\n<p>Por enquanto, por\u00e9m, vamos avan\u00e7ar com a separa\u00e7\u00e3o das coisas.<\/p>\n<h3>1 Pegue os IDs de postagem com a meta-chave associada<\/h3>\n<p>Assim como na primeira postagem, queremos ter certeza de que estamos recuperando IDs de postagem relacionados a uma meta-chave espec\u00edfica.<\/p>\n<p>Para tornar essa fun\u00e7\u00e3o o mais flex\u00edvel poss\u00edvel, vamos configur\u00e1-la para:<\/p>\n<ul>\n<li>aceite a meta-chave como uma string,<\/li>\n<li>retornar uma matriz<\/li>\n<\/ul>\n<p>A fun\u00e7\u00e3o ent\u00e3o ficar\u00e1 mais ou menos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Locates all of the post IDs that are associated with an empty meta key (which\n * is specified as an argument for the function).\n *\n * @param string $metaKey The meta key used to retrieve the set of post IDs.\n * @return array $results The set of product IDs associated with the specified meta key.\n *\/\npublic function getInactivePostIds(string $metaKey): array\n{\n    global $wpdb;\n\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            $metaKey) );\n\n    return $results;\n}<\/code><\/pre>\n<p>No primeiro post, dividimos isso em tr\u00eas etapas (que tamb\u00e9m s\u00e3o descritas acima). Aqui, por\u00e9m, podemos combinar a segunda e a terceira etapa em uma \u00fanica fun\u00e7\u00e3o.<\/p>\n<h3>2 Atualizar o status da postagem<\/h3>\n<p>Como mencionei, o \u00fanico aspecto da programa\u00e7\u00e3o orientada a objetos \u00e9 garantir que as fun\u00e7\u00f5es que estamos usando sejam agn\u00f3sticas quanto \u00e0 forma como os dados foram gerados e que est\u00e3o recebendo.<\/p>\n<p>Em vez disso, eles t\u00eam um \u00fanico algoritmo a ser executado para se concentrar nos dados que s\u00e3o passados \u200b\u200bpara a fun\u00e7\u00e3o. Nesse caso, queremos pegar o conjunto de resultados \u2013 que s\u00e3o IDs de postagem \u2013 e atualizar seu status de postagem para que seja definido como <strong>rascunho<\/strong>.<\/p>\n<p>Isso significa que a fun\u00e7\u00e3o aceitar\u00e1 um array, mas n\u00e3o retornar\u00e1 nada. Potencialmente, voc\u00ea poderia manter o controle de muitas postagens atualizadas (ou se atualizou alguma coisa), mas estou focado em apenas refatorar o c\u00f3digo que j\u00e1 temos.<\/p>\n<p>Ent\u00e3o \u00e9 isso que vamos fazer. E a primeira coisa \u00e9 certificar-se de que h\u00e1 dados reais com os quais trabalhar E, em caso afirmativo, itere atrav\u00e9s da matriz de lista de IDs de postagem e <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">altere seu status de postagem:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Updates incoming posts by setting their post status to 'draft.'\n *\n * @param array $postData the set of post IDs associated with the specific meta key.\n *\/\npublic function setPostsToDraft(array $postData)\n{\n    \/\/ If the post data is empty, there's nothing to do.\n    if (0 === count($postData)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    global $wpdb;\n    foreach ($postData as $post) {\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) ($post-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Voc\u00ea pode ver que n\u00e3o \u00e9 muito diferente do trabalho que foi feito no primeiro post, mas agora levanta algumas quest\u00f5es.<\/p>\n<h3>3 Considera\u00e7\u00f5es Orientadas a Objetos<\/h3>\n<p>Ao trabalhar com c\u00f3digo como este:<\/p>\n<ul>\n<li>Todos pertencem \u00e0 mesma classe ou classes separadas?<\/li>\n<li>Deve haver uma classe base e, em caso afirmativo, por que ou por que n\u00e3o?<\/li>\n<li>Deve haver uma \u00fanica fun\u00e7\u00e3o p\u00fablica invocada que chame esses m\u00e9todos (e marque-os como privados)?<\/li>\n<li>Devemos deixar as fun\u00e7\u00f5es p\u00fablicas?<\/li>\n<\/ul>\n<p>Para este post, vou fazer o seguinte:<\/p>\n<ul>\n<li><strong>Exponha cada fun\u00e7\u00e3o como um m\u00e9todo p\u00fablico<\/strong>. Isso \u00e9 para que, se houver dados retornados do primeiro m\u00e9todo, voc\u00ea possa fazer outra coisa com eles.<\/li>\n<li><strong>Mantenha-o contido em uma \u00fanica classe<\/strong>. Dessa forma, podemos instanciar uma \u00fanica classe e us\u00e1-la para fazer qualquer trabalho que precisemos fazer. Se houvesse outros m\u00e9todos, usar\u00edamos esses mesmos m\u00e9todos.<\/li>\n<li><strong>Comece com a interface<\/strong>. N\u00e3o vou me incomodar em escrever uma interface apenas para mostrar uma interface (suponho que seja f\u00e1cil deduzir dadas as fun\u00e7\u00f5es que temos agora), mas vou pegar a classe e mostrar como podemos invocar o fun\u00e7\u00f5es &#8220;de fora para dentro&quot;.<\/li>\n<\/ul>\n<p>Ent\u00e3o eu vou come\u00e7ar com <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o \u00faltimo ponto<\/a> e trabalhar para tr\u00e1s. Aqui est\u00e1 uma maneira de trabalhar com o c\u00f3digo:<\/p>\n<pre><code>&lt;?php\n\n$postStatusModifier = new PostStatusModifier();\n$inactivePost = $postStatusModifier-&gt;getInactivePostIds('acme-status');\n$postStatusModifier-&gt;setPostsToDraft($inactivePosts);<\/code><\/pre>\n<p>E ent\u00e3o aqui est\u00e1 a apar\u00eancia <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de toda a classe :<\/a><\/p>\n<pre><code>&lt;?php\n\nclass PostStatusModifier\n{\n    \/**\n     * Locates all of the post IDs that are associated with an empty meta key (which\n     * is specified as an argument for the function).\n     *\n     * @param string $metaKey The meta key used to retrieve the set of post IDs.\n     * @return array $results The set of product IDs associated with the specified meta key.\n     *\/\n    public function getInactivePostIds(string $metaKey): array\n    {\n        global $wpdb;\n\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                $metaKey) );\n\n        return $results;\n    }\n\n    \/**\n     * Updates incoming posts by setting their post status to 'draft.'\n     *\n     * @param array $postData the set of post IDs associated with the specific meta key.\n     *\/\n    public function setPostsToDraft(array $postData)\n    {\n        \/\/ If the post data is empty, there's nothing to do.\n        if (0 === count($postData)) {\n            return;\n        }\n\n        \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n        global $wpdb;\n        foreach ($postData as $post) {\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) ($post-&gt;post_id)) );\n        }\n    }\n}<\/code><\/pre>\n<p>De um modo geral, isso servir\u00e1 aos mesmos prop\u00f3sitos que o primeiro, mas de uma maneira mais orientada a objetos.<\/p>\n<h2>Esse n\u00e3o \u00e9 o caminho<\/h2>\n<p>Como tentei reiterar v\u00e1rias vezes neste post, essa n\u00e3o \u00e9 a maneira definitiva de fazer esse trabalho. Em vez disso, \u00e9 uma maneira que o trabalho pode ser feito.<\/p>\n<p>Voc\u00ea pode reprojetar, refatorar ou reutilizar isso da maneira que achar melhor. O objetivo, por\u00e9m, \u00e9 mostrar como desacoplar a l\u00f3gica que normalmente vemos como procedural em algo que \u00e9 um pouco menos dependente de si mesmo e deixa espa\u00e7o para trabalho adicional.<\/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>Usando princ\u00edpios orientados a objetos para melhorar o design de classe para escrever consultas de banco de dados para atualizar dados rapidamente.<\/p>\n","protected":false},"author":1,"featured_media":237043,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,837,920,846],"tags":[1170],"class_list":["post-231713","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-outro","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231713","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=231713"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231713\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}