{"id":230832,"date":"2022-12-06T15:57:00","date_gmt":"2022-12-06T12:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230832"},"modified":"2022-12-06T15:57:32","modified_gmt":"2022-12-06T12:57:32","slug":"sobre-como-escrever-funcoes-legiveis-do-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/sobre-como-escrever-funcoes-legiveis-do-wordpress\/","title":{"rendered":"Sobre como escrever fun\u00e7\u00f5es leg\u00edveis do WordPress"},"content":{"rendered":"\n<p>Uma das coisas que considero consistentemente interessantes (tanto do ponto de vista da programa\u00e7\u00e3o quanto do ponto de vista do WordPress), \u00e9 isso:<\/p>\n<p>Eu gosto de manter o c\u00f3digo separado de forma que o c\u00f3digo respons\u00e1vel por interagir com o WordPress seja relegado ao seu namespace enquanto o resto do nosso c\u00f3digo \u00e9 namespaced apropriadamente em outro lugar.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/um-guia-simples-para-organizar-classes-centradas-no-wordpress\/\" title=\"Eu acho que isso \u00e9 \u00f3bvio\">Eu acho que isso \u00e9 \u00f3bvio<\/a><\/strong>, no entanto.<\/p>\n<p>No entanto, quando se trata de escrever c\u00f3digo, isso n\u00e3o significa que deva ser deixado simplesmente para a forma como escrevemos nossas classes e depois as organizamos. E as coisas em um n\u00edvel um pouco mais granular?<\/p>\n<p>Ou seja, e se observ\u00e1ssemos os m\u00e9todos como parte de um todo maior e tiv\u00e9ssemos certeza de que eles tamb\u00e9m est\u00e3o fazendo seu trabalho bem? Claro, pessoas como <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> t\u00eam escrito sobre esse tipo de coisa durante a maior parte de sua carreira e pregado para pessoas como n\u00f3s.<\/p>\n<p>Mas esses conceitos s\u00e3o algo que voc\u00ea simplesmente come\u00e7a a fazer e depois os aplica para sempre. Os paradigmas mudam, somos melhores hoje do que ontem, e pode haver v\u00e1rias maneiras de alcan\u00e7ar o mesmo tipo de coisa.<\/p>\n<p>Ent\u00e3o, quando se trata de criar fun\u00e7\u00f5es leg\u00edveis do WordPress para um dom\u00ednio espec\u00edfico, como isso pode ser?<\/p>\n<h2>Fun\u00e7\u00f5es leg\u00edveis do WordPress<\/h2>\n<p>Para aqueles que est\u00e3o familiarizados com os princ\u00edpios <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID<\/a> ou qualquer coisa que fale sobre escrever um bom c\u00f3digo, uma das coisas sobre as quais muitas dessas pessoas escrevem \u00e9 sobre o tamanho que um m\u00e9todo deve ter.<\/p>\n<p>Eu tendo a consider\u00e1-los como regras ao inv\u00e9s de leis porque, \u00e0s vezes, os m\u00e9todos simplesmente n\u00e3o podem ser t\u00e3o curtos. Quer dizer, eu acho que eles poderiam, mas em algum momento parece microgerenciamento de c\u00f3digo, certo?<\/p>\n<p>E fazer algo por fazer \u00e9 uma coisa, mas fazer algo por uma programa\u00e7\u00e3o significativa \u00e9 outra. Eu vou escolher o mais tarde de cada vez.<\/p>\n<p>De qualquer forma, aqui est\u00e1 um exemplo: Digamos que voc\u00ea tenha algum c\u00f3digo que \u00e9 chamado via Ajax e antes de prosseguir com a opera\u00e7\u00e3o, voc\u00ea precisa saber se existe um tipo de postagem personalizado.<\/p>\n<p>As etapas para fazer algo assim podem ser as seguintes:<\/p>\n<ul>\n<li>iniciar a chamada Ajax,<\/li>\n<li>verifique o nonce de seguran\u00e7a para verificar se \u00e9 uma solicita\u00e7\u00e3o v\u00e1lida,<\/li>\n<li>verifique se existem dados,<\/li>\n<li>se isso acontecer, retorne uma mensagem de sucesso; caso contr\u00e1rio, retorne uma mensagem de erro.<\/li>\n<\/ul>\n<p>Tudo isso pode ser feito em uma \u00fanica mensagem, claro, mas vamos supor que queremos escrever isso em uma s\u00e9rie de chamadas que s\u00e3o f\u00e1ceis de ler onde o c\u00f3digo \u00e9 autodocumentado, at\u00e9 certo ponto (isso n\u00e3o significa que eu sou contra coment\u00e1rios \u2013 n\u00e3o sou nada disso, mas isso n\u00e3o significa que queremos que nosso c\u00f3digo n\u00e3o seja claro, n\u00e3o \u00e9?).<\/p>\n<p>Primeiro, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a chamada Ajax<\/a><\/strong> :<\/p>\n<pre><code>$.get(ajaxurl, {\n    'action': 'getDetails',\n    'security': $('input[name=\"acme-security-nonce\"]').val()\n}, function(response) {\n    if (false === response.success) {\n        \/\/ Handle the case when the request wasn't successful.\n    }\n\n    \/\/ Work with the information that was returned in the response.data property.\n});<\/code><\/pre>\n<p>Em seguida <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, temos uma fun\u00e7\u00e3o<\/a><\/strong> no lado do servidor para verificar explicitamente o nonce de seguran\u00e7a (isso, \u00e9 claro, pressup\u00f5e que voc\u00ea o esteja configurando corretamente no front-end):<\/p>\n<pre><code>&lt;?php\n\/**\n * @return bool true if we're able to make Ajax requests; otherwise, false\n *\/\nprivate function verifyRequest()\n{\n    return\n        isset($_GET['security']) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');\n}<\/code><\/pre>\n<p>Depois disso, queremos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">verificar se os dados existem:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return bool true if there are details; false, otherwise\n *\n * @access private\n *\/\nprivate function doDetailsExist()\n{\n    return (new WP_Query([\n        'post_type' =&gt; 'acme_post_type',\n        'post_status' =&gt; 'publish',\n    ]))-&gt;have_posts();\n}<\/code><\/pre>\n<p>A partir daqui, podemos trabalhar com o objeto de resposta Ajax avaliando sua propriedade de sucesso e reagindo de acordo.<\/p>\n<h2>Indo um passo al\u00e9m<\/h2>\n<p>Vamos dar um passo adiante e dizer que os produtos existem e queremos recuperar todos os seus IDs de postagem. Fazer isso com WP_Query \u00e9 bem f\u00e1cil, mas digamos, por divers\u00e3o, queremos fazer interface com o banco de dados diretamente.<\/p>\n<p>Observe que este \u00e9 mais um exerc\u00edcio de mostrar uma maneira de fazer algo em vez de argumentar pelo uso de <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a><\/strong> em vez de <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>. Isso \u00e9 conte\u00fado para um outro post.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.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-162675-61e7429944302.png\" alt=\"Sobre como escrever fun\u00e7\u00f5es leg\u00edveis do WordPress\"><\/a><\/p>\n<p>De qualquer forma, determinamos que os dados existem. Ent\u00e3o, vamos pegar uma matriz de todos os IDs de postagem e devolv\u00ea-la ou uma matriz vazia. Talvez isso se parecesse <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">com isso:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * @return array a numerically indexed array of all detail IDs\n*\/\nprivate function getDetailIds(): array\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\"\n        SELECT meta_value\n        FROM $wpdb-&gt;postmeta\n        WHERE meta_key = %s\n        ORDER BY meta_value ASC\n        \", 'acme_detail_number'),\n        ARRAY_N\n    );\n\n    $detailIds = [];\n    array_push($detailIds, array_map(function ($result) {\n        return $result[0];\n    }, $results));\n\n    return $detailIds[0] ?? $detailIds;\n}<\/code><\/pre>\n<p>Uma vez que os valores s\u00e3o retornados, podemos ent\u00e3o oper\u00e1-los da maneira que acharmos melhor.<\/p>\n<h2>Qual \u00e9 o prop\u00f3sito de tudo isso?<\/h2>\n<p>De um modo geral, \u00e9 para nos ajudar a pensar sobre o c\u00f3digo de tal forma que possamos l\u00ea-lo quase o mais pr\u00f3ximo poss\u00edvel da palavra escrita. Ou seja, podemos apontar para um peda\u00e7o de c\u00f3digo como digamos:<\/p>\n<blockquote>\n<p>Primeiro, veremos se algo existe. Caso contr\u00e1rio, enviaremos um erro; caso contr\u00e1rio, pegaremos os dados e trabalharemos neles.<\/p>\n<\/blockquote>\n<p>Concedido, estou falando em termos menos concretos aqui, mas isso \u00e9 porque eu n\u00e3o sei necessariamente com o que voc\u00ea est\u00e1 trabalhando mais do que voc\u00ea sabe sobre o meu trabalho. Mas voc\u00ea entendeu a ideia, certo?<\/p>\n<p>E al\u00e9m disso, se voc\u00ea estiver procurando um c\u00f3digo de teste de unidade desacoplado do WordPress, isso pode ser feito atrav\u00e9s do uso de interfaces que simulam as fun\u00e7\u00f5es ou at\u00e9 mesmo que executam consultas diretas no banco de dados sem precisar usar o WordPress.<\/p>\n<p>Mas, como em alguns dos pontos mencionados acima, isso \u00e9 assunto para um post diferente.<\/p>\n<p>Atualmente estou escrevendo um eBook (junto com uma variedade de outros conte\u00fados premium). Se voc\u00ea estiver interessado, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">confira o que voc\u00ea recebe<\/a>.<\/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>O que realmente significa escrever fun\u00e7\u00f5es leg\u00edveis do WordPress? N\u00e3o existe uma resposta certa, perfeita e precisa, mas talvez essa abordagem ajude.<\/p>\n","protected":false},"author":1,"featured_media":236179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[867],"tags":[1170],"class_list":["post-230832","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230832","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=230832"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230832\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}