{"id":229410,"date":"2022-11-01T11:53:00","date_gmt":"2022-11-01T08:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229410"},"modified":"2022-11-09T06:54:56","modified_gmt":"2022-11-09T03:54:56","slug":"construtores-de-plugins-do-wordpress-nao-devem-definir-ganchos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/construtores-de-plugins-do-wordpress-nao-devem-definir-ganchos\/","title":{"rendered":"Construtores de plugins do WordPress n\u00e3o devem definir ganchos"},"content":{"rendered":"\n<p>Os construtores de plugins do WordPress parecem ser cada vez mais um t\u00f3pico de debate quando se trata do que eles devem definir. J\u00e1 falei sobre isso antes, mas n\u00e3o h\u00e1 problema em revisitar um t\u00f3pico como esse de vez em quando, certo?<\/p>\n<p>Afinal, h\u00e1 coisas que aprendemos e coisas que mudamos \u00e0 medida que ganhamos mais experi\u00eancia.<\/p>\n<p>N\u00e3o \u00e9 incomum ver plugins definindo ganchos e outros comportamentos, mas n\u00e3o sou f\u00e3 dessa abordagem. Em vez disso, acho que o tratamento do registro do gancho deve ser feito em sua pr\u00f3pria fun\u00e7\u00e3o ou, ainda mais drasticamente, tratado por um conjunto de classes.<\/p>\n<p>Mas antes de entrar nisso, quero explicar o que deve estar em um construtor de plugins do WordPress, por que ele deve estar em um construtor e como isso pode ser tratado ao trabalhar em seus plugins.<\/p>\n<h2>Construtores de plugins do WordPress<\/h2>\n<p>Desde o in\u00edcio, acho que os construtores devem ser usados \u200b\u200bpara uma coisa:<\/p>\n<ul>\n<li>Inicializando o estado de um objeto.<\/li>\n<\/ul>\n<p>O que define o estado inicial de um objeto pode depender se ele foi criado &#8220;do zero&quot; ou se est\u00e1 sendo carregado com informa\u00e7\u00f5es de um conjunto anterior (como uma sess\u00e3o sendo serializada).<\/p>\n<ul>\n<li>atributos s\u00e3o substantivos que descrevem um objeto,<\/li>\n<li>fun\u00e7\u00f5es s\u00e3o verbos que descrevem o que o objeto pode fazer.<\/li>\n<\/ul>\n<p>As fun\u00e7\u00f5es, \u00e9 claro, fazem o trabalho que o objeto \u00e9 capaz de fazer. Eles podem modificar o estado do objeto quando chamados, ou podem trabalhar nos argumentos passados \u200b\u200bpara as fun\u00e7\u00f5es.<\/p>\n<h3>O que deve ir em um construtor?<\/h3>\n<p>Quando um objeto \u00e9 constru\u00eddo, ele deve simplesmente ser configurado de tal forma que seus atributos sejam configurados e suas fun\u00e7\u00f5es estejam prontas para funcionar.<\/p>\n<p>Se houver algo no construtor que n\u00e3o afete o estado inicial de um objeto, ele n\u00e3o deve estar l\u00e1.<\/p>\n<h3>Por que os atributos devem estar em um construtor?<\/h3>\n<p>Talvez uma maneira melhor de fazer essa pergunta seja:<\/p>\n<p>Por que os ganchos n\u00e3o devem ser definidos no construtor?<\/p>\n<p>O sistema de ganchos do WordPress faz parte do <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_programming\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">padr\u00e3o de design orientado a eventos<\/a> (do qual sou f\u00e3), mas registrar ganchos n\u00e3o descreve o estado do objeto. Em vez disso, no n\u00edvel mais fundamental, \u00e9 algo que cria um relacionamento com o objeto e o WordPress.<\/p>\n<p>O estado inicial do objeto n\u00e3o precisa conhecer o WordPress, ter alguma de suas fun\u00e7\u00f5es configuradas para ser acoplada ao WordPress, ou precisar fazer qualquer processamento com o WordPress.<\/p>\n<p>Lembre-se, os atributos s\u00e3o inicializados em um construtor. WordPress n\u00e3o \u00e9 um atributo. \u00c9 uma depend\u00eancia. Criar uma depend\u00eancia \u00e9 realizar uma a\u00e7\u00e3o que \u00e9 a defini\u00e7\u00e3o de um verbo.<\/p>\n<p>Assim, todo registro de gancho deve ser feito em uma fun\u00e7\u00e3o.<\/p>\n<h3>Como podemos lidar com o registro de gancho?<\/h3>\n<p>Este \u00e9 um daqueles t\u00f3picos que podem ser um post ou uma s\u00e9rie de posts pr\u00f3prios.<\/p>\n<ul>\n<li>\u00c9 poss\u00edvel criar uma classe que mantenha um registro de objetos e os ganchos com o WordPress.<\/li>\n<li>Tamb\u00e9m \u00e9 poss\u00edvel definir o registro de gancho dentro de uma fun\u00e7\u00e3o na classe.<\/li>\n<li>Tamb\u00e9m podemos fazer v\u00e1rias coisas com <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">invers\u00e3o de depend\u00eancia<\/a>.<\/li>\n<\/ul>\n<p>Todos os itens acima s\u00e3o coisas que est\u00e3o al\u00e9m do escopo deste post, mas para simplificar, mostrarei um exemplo de como uma classe pode registrar suas fun\u00e7\u00f5es com o WordPress <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">em uma fun\u00e7\u00e3o init<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>Dessa forma, podemos instanciar o objeto, test\u00e1-lo, us\u00e1-lo etc., mas n\u00e3o precisamos lidar com nada relacionado ao WordPress sem chamar explicitamente a\u00a0 fun\u00e7\u00e3o <strong>init<\/strong>.<\/p>\n<p>Uma vez que isso \u00e9 chamado, a depend\u00eancia \u00e9 criada, o WordPress \u00e9 necess\u00e1rio e as coisas ficam mais complicadas.<\/p>\n<h2>Ah, e essa coisa de teste<\/h2>\n<p>Quero mencionar mais um ponto que est\u00e1 um pouco al\u00e9m do escopo e do objetivo deste post, mas ainda \u00e9 relevante: Quando se trata de testar uma classe, devemos ser capazes de:<\/p>\n<ol>\n<li>crie uma inst\u00e2ncia da classe,<\/li>\n<li>testando sua l\u00f3gica chamando fun\u00e7\u00f5es,<\/li>\n<li>passando-lhe par\u00e2metros e avaliando seus valores de retorno.<\/li>\n<\/ol>\n<p>E devemos ser capazes de fazer o m\u00e1ximo poss\u00edvel de forma isolada. Se os ganchos forem definidos no construtor, ele cria uma depend\u00eancia imediata no WordPress que n\u00e3o deve ser necess\u00e1ria.<\/p>\n<p>O WordPress n\u00e3o descreve o estado de um objeto. \u00c9 uma depend\u00eancia do objeto.<\/p>\n<p>De qualquer forma, o ponto que estou tentando mostrar \u00e9 que os construtores de plugins do WordPress n\u00e3o devem lidar com o registro de ganchos porque os ganchos n\u00e3o descrevem seu estado. Eles est\u00e3o relacionados a algo que a classe faz e nos impedem de testar um objeto isoladamente.<\/p>\n<p>Ent\u00e3o eles t\u00eam seu lugar, mas n\u00e3o \u00e9 no construtor.<\/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>Os construtores de plugins do WordPress n\u00e3o devem lidar com o registro de ganchos porque os ganchos n\u00e3o descrevem seu estado.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,806,816,846,867],"tags":[1170],"class_list":["post-229410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229410","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=229410"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229410\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}