{"id":231302,"date":"2022-12-17T09:32:00","date_gmt":"2022-12-17T06:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231302"},"modified":"2022-12-07T11:44:08","modified_gmt":"2022-12-07T08:44:08","slug":"widgets-do-wordpress-refatoracao-parte-5","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-refatoracao-parte-5\/","title":{"rendered":"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 5"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">No post anterior<\/a><\/strong>, criamos um Registro que ser\u00e1 usado para armazenar todas as v\u00e1rias classes respons\u00e1veis \u200b\u200bpor dar funcionalidade ao nosso widget.<\/p>\n<p>Para fazer isso, haver\u00e1 uma variedade de outras classes introduzidas, mas antes de ir para l\u00e1, precisamos adicionar o Registro ao bootstrap do plugin (quanto mais criar um bootstrap para o plugin).<\/p>\n<p>Especificamente, aqui \u00e9 onde paramos:<\/p>\n<blockquote>\n<p>Como mencionado anteriormente no post, precisamos adicionar isso ao bootstrap do plugin. Para fazer isso, por\u00e9m, precisamos definir nosso pr\u00f3prio filtro para que possamos passar facilmente o registro pelo resto do plugin (quando chegar a hora de fazer isso).<\/p>\n<\/blockquote>\n<p>Ent\u00e3o, neste post, vamos nos concentrar em fazer exatamente isso.<\/p>\n<h2>The WordPress Widget Boilerplate: Refatora\u00e7\u00e3o, Parte 5<\/h2>\n<p>Se voc\u00ea tem acompanhado a s\u00e9rie at\u00e9 este ponto, ent\u00e3o voc\u00ea deve estar em uma boa posi\u00e7\u00e3o especificamente para adicionar o Registro para que tenhamos acesso a ele em todo o plugin.<\/p>\n<p>Para fazer isso, por\u00e9m, pressup\u00f5e-se que voc\u00ea saiba definir seus filtros. No WordPress, <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usamos a\u00e7\u00f5es e filtros o tempo todo<\/a>.<\/p>\n<p>A coisa sobre esses ganchos \u00e9 que eles j\u00e1 est\u00e3o definidos, no entanto. Ent\u00e3o, como definimos nosso filtro?<\/p>\n<p>Vamos dar uma olhada em fazer exatamente isso.<\/p>\n<h3>1 Definindo nosso filtro<\/h3>\n<p>Primeiramente, precisamos entender alguns conceitos:<\/p>\n<ul>\n<li>o que \u00e9 um filtro,<\/li>\n<li>como adicionar um filtro,<\/li>\n<li>como introduzir nosso registro no filtro<\/li>\n<li>como recuperar a classe do filtro.<\/li>\n<\/ul>\n<p>Felizmente, todos os itens acima s\u00e3o f\u00e1ceis de explicar.<\/p>\n<h4>O que \u00e9 um Filtro?<\/h4>\n<p>Simplificando, os ganchos nos permitem chamar o WordPress em momentos espec\u00edficos durante a execu\u00e7\u00e3o do programa. As a\u00e7\u00f5es geralmente s\u00e3o reservadas para o comportamento; Os filtros s\u00e3o reservados para dados.<\/p>\n<p>Al\u00e9m disso, os filtros nos permitem trabalhar com dados espec\u00edficos na aplica\u00e7\u00e3o \u2013 podem ser dados pr\u00e9-existentes ou at\u00e9 mesmo dados novos. E no nosso caso, ser\u00e1 a classe Registry que cont\u00e9m refer\u00eancias a outros dados.<\/p>\n<h4>Adicionando um filtro<\/h4>\n<p>Adicionar um filtro \u00e9 f\u00e1cil. Tem tr\u00eas partes para isso:<\/p>\n<ol>\n<li>chamando <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">add_filter<\/a> ,<\/li>\n<li>definir um identificador exclusivo para o filtro,<\/li>\n<li>passando informa\u00e7\u00f5es para o filtro que podem ser retornadas sempre que forem chamadas.<\/li>\n<\/ol>\n<p>Para n\u00f3s, vou identificar nosso registro como o filtro <strong>wpWidgetRegistry<\/strong>. Observe, no entanto, que \u00e9 importante que voc\u00ea escolha um nome exclusivo para sua implementa\u00e7\u00e3o, pois se n\u00e3o o fizer, poder\u00e1 acabar com colis\u00f5es com outros dados se outro plug-in usar o mesmo identificado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc432bb7.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-161108-61e71bc432bb7.png\" alt=\"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 5\" ><\/a><\/p>\n<p>De qualquer forma, adicionar um filtro realiza uma tarefa simples:<\/p>\n<blockquote>\n<p>Conecte uma fun\u00e7\u00e3o ou m\u00e9todo a uma a\u00e7\u00e3o de filtro espec\u00edfica.<\/p>\n<\/blockquote>\n<p>Isso significa que precisamos definir um m\u00e9todo com nosso ID. Devido \u00e0 natureza do PHP, n\u00e3o precisamos usar uma fun\u00e7\u00e3o separada.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc81c90d.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-161108-61e71bc81c90d.png\" alt=\"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 5\" ><\/a><\/p>\n<p>Em vez disso, podemos usar <a href=\"https:\/\/secure.php.net\/manual\/en\/functions.anonymous.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma fun\u00e7\u00e3o an\u00f4nima<\/a>.<\/p>\n<blockquote>\n<p>Fun\u00e7\u00f5es an\u00f4nimas, tamb\u00e9m conhecidas como closures, permitem a cria\u00e7\u00e3o de fun\u00e7\u00f5es que n\u00e3o possuem nome especificado. Eles s\u00e3o mais \u00fateis como o valor dos par\u00e2metros de retorno de chamada, mas t\u00eam muitos outros usos.<\/p>\n<\/blockquote>\n<p>A fun\u00e7\u00e3o an\u00f4nima que vamos definir aceitar\u00e1 uma refer\u00eancia ao plugin como argumento e a retornar\u00e1 sempre que o filtro for chamado (o que ser\u00e1 mostrado mais adiante neste artigo).<\/p>\n<h4>Passando informa\u00e7\u00f5es para o nosso filtro<\/h4>\n<p>Agora que temos tudo isso coberto, podemos passar pelo processo de cria\u00e7\u00e3o de uma inst\u00e2ncia do nosso Registro, definindo um filtro e, em seguida, adicionando o registro, para que fique acess\u00edvel em todo o aplicativo.<\/p>\n<p>Portanto, dentro do arquivo principal do plugin, que \u00e9 o arquivo <strong>wordpress-widget-boilerplate.php<\/strong>, adicionamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-00-bootstrap-namespace-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as seguintes linhas de c\u00f3digo<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/\/ More to come...\n<\/code><\/pre>\n<p>O acima declara o namespace no qual o Registro reside. Em seguida, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-01-bootstrap-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">adicionamos o seguinte bloco de c\u00f3digo abaixo do autoloader:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpWidgetRegistry', function() use ($registry) {\n    return $registry;\n});\n<\/code><\/pre>\n<p>Observe que quando voc\u00ea pretende ativar o plug-in, ele n\u00e3o ser\u00e1 ativado e gerar\u00e1 um erro. Isso \u00e9 por causa da falta de um autoloader que ser\u00e1 discutido no pr\u00f3ximo post.<\/p>\n<h3>2 Recuperando Nosso Registro<\/h3>\n<p>Como o registro \u00e9 definido no bootstrap do plugin e \u00e9 feito atrav\u00e9s do uso de um filtro, podemos acessar o registro em qualquer lugar do nosso plugin chamando nosso filtro personalizado.<\/p>\n<p>Por exemplo, digamos que estamos em outra classe e precisamos obter uma refer\u00eancia ao registro. Para fazer isso, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-02-retrieve-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podemos fazer esta chamada<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Retrieve the registry anywhere in the plugin.\n$registry = apply_filters('wpWidgetRegistry', null);\n<\/code><\/pre>\n<p>E \u00e9 isso. F\u00e1cil, certo? Desde que tudo tenha sido devidamente adicionado ao registro \u2013 o que ser\u00e1 abordado em breve \u2013 poderemos acessar todos eles atrav\u00e9s dos identificadores exclusivos que usamos no <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post anterior.<\/a><\/p>\n<h2>O carregador autom\u00e1tico<\/h2>\n<p>Agora estamos come\u00e7ando a usar namespaces e outras classes. Isso significa que precisaremos usar carregadores autom\u00e1ticos.<\/p>\n<p>Ent\u00e3o, antes de come\u00e7armos a refatorar a classe inteira como ela est\u00e1 agora, vamos fazer um pequeno desvio em alguns dos recursos do Composer para ver como ele \u00e9 usado para gerar um autoloader (al\u00e9m das coisas que j\u00e1 estamos us\u00e1-lo para lidar com a qualidade do nosso c\u00f3digo-fonte).<\/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>Uma vez que temos um Registro, precisamos poder acess\u00e1-lo em todo o nosso plugin e fazemos isso com ganchos personalizados.<\/p>\n","protected":false},"author":1,"featured_media":236152,"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-231302","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\/231302","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=231302"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231302\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236152"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}