{"id":231116,"date":"2022-12-13T13:11:00","date_gmt":"2022-12-13T10:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231116"},"modified":"2022-12-13T13:12:31","modified_gmt":"2022-12-13T10:12:31","slug":"widgets-do-wordpress-uma-abordagem-orientada-a-objetos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-uma-abordagem-orientada-a-objetos\/","title":{"rendered":"Widgets do WordPress: uma abordagem orientada a objetos"},"content":{"rendered":"\n<p>Anos atr\u00e1s, criei o <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> com o objetivo de ser o seguinte:<\/p>\n<blockquote>\n<p>Um clich\u00ea organizado e sustent\u00e1vel para criar widgets usando as melhores pr\u00e1ticas do WordPress.<\/p>\n<\/blockquote>\n<p>Desde ent\u00e3o, n\u00e3o mudou muito em rela\u00e7\u00e3o \u00e0 <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API de Widgets<\/a><\/strong> (que veremos mais adiante neste post), mas o que considero como &quot;melhores pr\u00e1ticas&quot; mudou. Al\u00e9m disso, o grau em que acho que essa API \u00e9 uma exemplo de programa\u00e7\u00e3o introdut\u00f3ria orientada a objetos no WordPress \u00e9 alta.<\/p>\n<p>N\u00e3o \u00e9 porque usa muitos princ\u00edpios orientados a objetos, n\u00e3o \u00e9 porque usa padr\u00f5es modernos (pelo menos no que diz respeito ao PHP moderno), mas porque usa algumas coisas que nos ajudam a reconhecer alguns, digamos, sinais sobre programa\u00e7\u00e3o orientada a objetos no WordPress.<\/p>\n<p>E isso \u00e9 algo que n\u00e3o deve ser subestimado: se voc\u00ea est\u00e1 procurando exemplos de programa\u00e7\u00e3o orientada a objetos no WordPress, procure por APIs que a empregam.<\/p>\n<p>Al\u00e9m disso, se voc\u00ea est\u00e1 procurando maneiras de avaliar seu pr\u00f3prio n\u00edvel de avalia\u00e7\u00e3o de um peda\u00e7o de c\u00f3digo (muito menos uma base de c\u00f3digo) para o uso de classes e alguns dos recursos mais avan\u00e7ados da OOP, por que n\u00e3o ter algum tipo de um teste decisivo para ver como voc\u00ea est\u00e1?<\/p>\n<\/p>\n<p>E a API Widgets faz exatamente isso.<\/p>\n<h2>Widgets do WordPress: uma introdu\u00e7\u00e3o<\/h2>\n<p>Ent\u00e3o, em uma s\u00e9rie menor do que a minha \u00faltima, pretendo analisar a API de Widgets e fazer algumas coisas:<\/p>\n<ol>\n<li>mostrar o esqueleto b\u00e1sico de um widget e por que ele \u00e9 orientado a objetos,<\/li>\n<li>discutir quais coisas voc\u00ea deve ser capaz de perceber e por qu\u00ea,<\/li>\n<li>atualize o Widget Boilerplate diretamente neste site primeiro e depois envie-o para o GitHub,<\/li>\n<li>construir um widget usando a API com o clich\u00ea como base para nosso trabalho.<\/li>\n<\/ol>\n<p>E neste post, vamos come\u00e7ar com o primeiro ponto acima.<\/p>\n<h3>Mas primeiro\u2026<\/h3>\n<p>Antes de entrar neste post, recomendo a leitura dos seguintes posts:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"Dois Pilares da Programa\u00e7\u00e3o Orientada a Objetos: Parte 1 de 2\">Dois Pilares da Programa\u00e7\u00e3o Orientada a Objetos: Parte 1 de 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-segundos-dois-pilares-da-poo\/\" title=\"Dois Pilares da Programa\u00e7\u00e3o Orientada a Objetos: Parte 2 de 2\">Dois Pilares da Programa\u00e7\u00e3o Orientada a Objetos: Parte 2 de 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/aulas-de-resumo-parte-1-comportamento-de-abstracao\/\" title=\"Aulas de Resumo, Parte 1 - Comportamento de Abstra\u00e7\u00e3o\">Aulas de Resumo, Parte 1 &#8211; Comportamento de Abstra\u00e7\u00e3o<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/classes-abstratas-parte-2-classes-abstratas-e-interfaces\/\" title=\"Classes Abstratas, Parte 2 - Classes Abstratas e Interfaces\">Classes Abstratas, Parte 2 &#8211; Classes Abstratas e Interfaces<\/a><\/strong><\/li>\n<\/ol>\n<p>Uma vez feito (ou se voc\u00ea sentir que j\u00e1 domina os t\u00f3picos), estamos prontos para come\u00e7ar.<\/p>\n<p>[restringir pago=&quot;verdadeiro&#8221;]<\/p>\n<h2>No\u00e7\u00f5es b\u00e1sicas da API de widgets<\/h2>\n<p>Se voc\u00ea ler a p\u00e1gina do manual em Widgets, ver\u00e1 muito conte\u00fado. Isso \u00e9 uma coisa boa, mas nem sempre \u00e9 a melhor jogada ao tentar destilar conte\u00fado para um p\u00fablico como voc\u00ea, quando voc\u00ea est\u00e1 procurando conselhos pr\u00e1ticos e orientados a objetos.<\/p>\n<p>Ent\u00e3o, vou selecionar as partes relevantes da documenta\u00e7\u00e3o da API e aplic\u00e1-las ao c\u00f3digo que tamb\u00e9m fornecemos.<\/p>\n<h3>O que \u00e9 um widget?<\/h3>\n<p>Acho que a maioria de n\u00f3s que trabalha com WordPress sabe o que \u00e9 um widget, mas \u00e9 importante definir o termo para que todos trabalhemos com a mesma ideia. <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">O manual diz:<\/a><\/strong><\/p>\n<blockquote>\n<p>Um widget \u00e9 um objeto PHP que gera algum HTML. O mesmo tipo de widget pode ser usado v\u00e1rias vezes na mesma p\u00e1gina (por exemplo, o widget de texto). Widgets podem salvar dados no banco de dados (na tabela de op\u00e7\u00f5es).<\/p>\n<\/blockquote>\n<p>Com isso em mente, vamos dar uma olhada no c\u00f3digo de um widget personalizado, pelo menos um stub dele, e ver o que podemos coletar no que diz respeito \u00e0 sua natureza orientada a objetos.<\/p>\n<h3>A classe de widgets<\/h3>\n<p>Antes mesmo de olharmos para o c\u00f3digo, sabemos que haver\u00e1 algum n\u00edvel de programa\u00e7\u00e3o orientada a objetos simplesmente porque a documenta\u00e7\u00e3o nos diz para fazer tr\u00eas coisas:<\/p>\n<ol>\n<li>Crie a classe do seu widget estendendo a classe padr\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> e algumas de suas fun\u00e7\u00f5es.<\/li>\n<li>Registre seu widget para que ele fique dispon\u00edvel na tela <strong>Widgets<\/strong>.<\/li>\n<li>Certifique-se de que seu tema tenha pelo menos uma <strong><a href=\"https:\/\/make.wordpress.org\/docs\/theme-developer-handbook\/theme-functionality\/sidebars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e1rea de widget<\/a><\/strong> na qual adicionar os widgets.<\/li>\n<\/ol>\n<p>Neste post, vou me concentrar no primeiro ponto (embora eventualmente cheguemos a como introduzimos nossos widgets em um tema antes que a s\u00e9rie termine).<\/p>\n<p>Ent\u00e3o, vamos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apresentar o c\u00f3digo<\/a><\/strong> como \u00e9 apresentado na documenta\u00e7\u00e3o e falar sobre o que podemos aprender com ele:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Primeiro, notamos que embora tenhamos definido uma classe (que podemos nomear o que quisermos, do meu jeito), ela deve estender <strong>WP_Widget<\/strong>. Isso significa que no n\u00facleo do WordPress, existe uma classe <strong>WP_Widget<\/strong>. Voc\u00ea pode ver um detalhamento bem organizado do c\u00f3digo-fonte <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-widget.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nesta p\u00e1gina.<\/a><\/strong><\/p>\n<p>Em segundo lugar, a palavra-chave <strong>extends<\/strong> indica que estamos usando <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">heran\u00e7a PHP,<\/a><\/strong> que \u00e9 um pilar central da programa\u00e7\u00e3o orientada a objetos.<\/p>\n<p>Terceiro, existem quatro fun\u00e7\u00f5es que devemos implementar, duas das quais requerem argumentos. As fun\u00e7\u00f5es que devemos implementar s\u00e3o as seguintes:<\/p>\n<ul>\n<li><strong>__construct()<\/strong> que \u00e9 o construtor b\u00e1sico da classe. \u00c9 aqui que precisamos ter certeza de que o construtor da classe pai \u00e9 chamado, se houver um, e ent\u00e3o inicializamos quaisquer propriedades que julgarmos necess\u00e1rias para nosso widget. Vamos dar uma olhada nisso mais tarde na s\u00e9rie.<\/li>\n<li><strong>widget()<\/strong> \u00e9 respons\u00e1vel pela sa\u00edda do conte\u00fado do widget que o usu\u00e1rio disponibiliza utilizando a interface na \u00e1rea administrativa. Ele aceita dois par\u00e2metros \u2013 <strong>$args<\/strong> e <strong>$instance.<\/strong> O par\u00e2metro <strong>$args<\/strong> \u00e9 a informa\u00e7\u00e3o a ser renderizada na p\u00e1gina, e a <strong>$instance<\/strong> \u00e9 uma refer\u00eancia \u00e0 inst\u00e2ncia do widget (j\u00e1 que v\u00e1rios widgets podem ser renderizados em uma p\u00e1gina).<\/li>\n<li><strong>form()<\/strong> exibe a interface administrativa com a qual o usu\u00e1rio interage para orientar qual \u00e9 a sa\u00edda no front-end do site. Ele tamb\u00e9m requer o argumento <strong>$instance<\/strong> para que as informa\u00e7\u00f5es fornecidas sejam para o widget real com o qual o usu\u00e1rio est\u00e1 trabalhando (versus todas as inst\u00e2ncias do widget).<\/li>\n<li><strong>update()<\/strong> \u00e9 usado para salvar os valores na inst\u00e2ncia atual do widget. Aceita dois argumentos. O primeiro \u00e9 a nova inst\u00e2ncia do widget com valores de atualiza\u00e7\u00e3o que o usu\u00e1rio forneceu (pense em atualizar o valor de um widget de texto ativo) e o segundo argumento \u00e9 o da inst\u00e2ncia antiga do widget ou talvez a inst\u00e2ncia anterior ou talvez &#8221; a inst\u00e2ncia que continha os valores anteriores.&#8221;<\/li>\n<\/ul>\n<p>Essas quatro fun\u00e7\u00f5es s\u00e3o necess\u00e1rias para serem implementadas como parte da API do widget, como parte das fun\u00e7\u00f5es herdadas da interface estendida e para produzir a funcionalidade b\u00e1sica de um widget.<\/p>\n<p>Isso n\u00e3o significa que mais n\u00e3o possam ser adicionados, mas em boa forma orientada a objetos, provavelmente seria melhor relegar esse comportamento a outras classes. Mas veremos como fazer isso mais tarde na s\u00e9rie, quando estivermos criando nosso pr\u00f3prio widget.<\/p>\n<h3>Quais s\u00e3o as principais conclus\u00f5es?<\/h3>\n<p>Para ter certeza de que estou claro quanto ao que seria entendido neste post, \u00e9 o seguinte:<\/p>\n<ul>\n<li>A API Widgets \u00e9 orientada a objetos. N\u00e3o \u00e9 apenas orientado a objetos porque usa uma classe (embora esse seja certamente um bom ponto de partida), mas tamb\u00e9m porque herda a funcionalidade constru\u00edda em uma classe base pr\u00e9-existente.<\/li>\n<li>Sempre que herdamos o comportamento de uma classe base ou de uma classe pai, estamos obtendo funcionalidades pr\u00e9-desenvolvidas gratuitamente. \u00c9 uma coisa realmente \u00f3tima sobre programa\u00e7\u00e3o orientada a objetos porque nos permite focar especificamente na l\u00f3gica de programa\u00e7\u00e3o que desejamos implementar.<\/li>\n<\/ul>\n<p>Imagine por um momento que voc\u00ea deseja desenvolver um widget, mas toda vez que o faz, voc\u00ea precisa escrever todas as funcionalidades para se conectar ao WordPress para fazer todas as mesmas funcionalidades repetitivas do clich\u00ea.<\/p>\n<p>\u00c9 aqui que a heran\u00e7a e a programa\u00e7\u00e3o orientada a objetos entram em cena. O c\u00f3digo repetitivo \u00e9 abstra\u00eddo em uma classe base, portanto, \u00e9 escrito apenas uma vez e, em seguida, o c\u00f3digo no qual queremos nos concentrar \u00e9 deixado para implementa\u00e7\u00e3o.<\/p>\n<p>Tudo o que foi dito acima \u00e9 o que deve ser entendido ao ler esta passagem inicial no c\u00f3digo-fonte para uma API b\u00e1sica orientada a objetos no WordPress.<\/p>\n<h2>Qual \u00e9 o pr\u00f3ximo?<\/h2>\n<p>Na pr\u00f3xima postagem desta s\u00e9rie, veremos a natureza orientada a objetos da API Widgets e quais coisas voc\u00ea deve ser capaz de detectar imediatamente lendo o c\u00f3digo.<\/p>\n<p>Isso ocorre porque \u00e9 importante reconhecer certos princ\u00edpios orientados a objetos na pr\u00e1tica e essa \u00e9 uma boa maneira de avaliar se voc\u00ea \u00e9 capaz de fazer isso ou n\u00e3o. Se estiver, \u00f3timo! Ent\u00e3o vai continuar a ajudar a desenvolver esse m\u00fasculo. Se n\u00e3o, n\u00e3o se preocupe \u2013 ainda ajuda a desenvolver esse m\u00fasculo.<\/p>\n<p>E isso ir\u00e1 atend\u00ea-lo bem \u00e0 medida que continuamos a avan\u00e7ar cada vez mais para o desenvolvimento WordPress orientado a objetos por meios pr\u00e1ticos.<\/p>\n<p>A teoria necess\u00e1ria foi coberta. Ent\u00e3o, vamos come\u00e7ar a coloc\u00e1-lo em pr\u00e1tica.<\/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>A API de widgets do WordPress ajuda a fornecer um teste decisivo s\u00f3lido e um exemplo de como come\u00e7ar a programa\u00e7\u00e3o orientada a objetos no WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236133,"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-231116","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\/231116","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=231116"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231116\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236133"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}