{"id":231437,"date":"2022-12-20T17:41:00","date_gmt":"2022-12-20T14:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231437"},"modified":"2022-12-07T10:15:44","modified_gmt":"2022-12-07T07:15:44","slug":"widgets-do-wordpress-refatoracao-parte-12","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-refatoracao-parte-12\/","title":{"rendered":"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 12"},"content":{"rendered":"\n<p>No que diz respeito \u00e0 refatora\u00e7\u00e3o do WordPress Widget Boilerplate \u2013 especialmente considerando o qu\u00e3o longe chegamos desde que o projeto come\u00e7ou h\u00e1 oito anos \u2013 fizemos muito trabalho.<\/p>\n<p>N\u00f3s o trouxemos para um padr\u00e3o muito mais moderno e estamos tornando muito mais f\u00e1cil trabalhar com ele, de modo que construir widgets futuros deve ser mais f\u00e1cil. E isso n\u00e3o \u00e9 apenas do padr\u00e3o do clich\u00ea, mas de um padr\u00e3o orientado a objetos para que a manuten\u00e7\u00e3o e a qualidade do c\u00f3digo sejam maiores.<\/p>\n<p>No \u00faltimo post, encerramos grande parte do trabalho da \u00e1rea de administra\u00e7\u00e3o e estamos prontos para come\u00e7ar nosso trabalho de c\u00f3digo para o front-end.<\/p>\n<p>N\u00f3s dissemos:<\/p>\n<blockquote>\n<p>Em seguida, veremos a renderiza\u00e7\u00e3o de conte\u00fado no front-end. Estamos chegando ao fim da refatora\u00e7\u00e3o do Boilerplate, mas h\u00e1 um pouco mais a fazer antes de estarmos prontos para merge-lo no branch master da base de c\u00f3digo.<\/p>\n<\/blockquote>\n<p>Ent\u00e3o, neste post, vamos pegar l\u00e1. Agora, se voc\u00ea est\u00e1 acompanhando at\u00e9 este ponto, deve ter tudo o que precisa do branch de desenvolvimento.<\/p>\n<p>Se n\u00e3o, certifique-se de pux\u00e1-lo, pois \u00e9 a\u00ed que vamos pegar no restante do post.<\/p>\n<h2>The WordPress Widget Boilerplate: Refatorando Parte 12<\/h2>\n<p>Agora, quando se trata do front-end, \u00e9 f\u00e1cil pensar no front-end como qualquer coisa que o usu\u00e1rio v\u00ea diante dele, independentemente de estar na \u00e1rea administrativa ou n\u00e3o.<\/p>\n<p>No entanto, esta s\u00e9rie deixou claro que estamos dividindo o que o usu\u00e1rio v\u00ea entre a \u00e1rea administrativa e a \u00e1rea p\u00fablica do site.<\/p>\n<p>Ent\u00e3o o que vamos fazer \u00e9 trabalhar na \u00e1rea do c\u00f3digo que renderiza informa\u00e7\u00f5es para o usu\u00e1rio na \u00e1rea p\u00fablica do site. Vamos come\u00e7ar simplesmente lendo as informa\u00e7\u00f5es e exibindo-as.<\/p>\n<p>Ent\u00e3o, na pr\u00f3xima postagem, veremos como trabalhar com l\u00f3gica condicional em rela\u00e7\u00e3o a algumas das op\u00e7\u00f5es para ver se h\u00e1 algo que precisamos fazer.<\/p>\n<p>Dito isso, vamos para o c\u00f3digo.<\/p>\n<h3>Sobre os dados que exibiremos<\/h3>\n<p>Lembre-se, o widget, neste momento, tem tr\u00eas coisas que influenciam sua exibi\u00e7\u00e3o:<\/p>\n<ol>\n<li>o t\u00edtulo do widget,<\/li>\n<li>o conte\u00fado do widget,<\/li>\n<li>uma altern\u00e2ncia sobre se devemos ou n\u00e3o exibir o t\u00edtulo<\/li>\n<\/ol>\n<p>A terceira op\u00e7\u00e3o \u00e9 principalmente mostrar como usar um tipo diferente de elemento. Porque, tecnicamente, se n\u00e3o quis\u00e9ssemos mostrar o t\u00edtulo do widget, n\u00e3o colocar\u00edamos nada no widget.<\/p>\n<p>Mas acho que ajuda a mostrar o uso de diferentes tipos de elementos e seus valores de maneira pr\u00e1tica (ou semi-pr\u00e1tica).<\/p>\n<p>De qualquer forma, com isso dito, sabemos que para cada inst\u00e2ncia do widget, os dados s\u00e3o armazenados com o <strong>t\u00edtulo<\/strong>, <strong>conte\u00fado<\/strong> e\u00a0 nome <strong>de t\u00edtulo de exibi\u00e7\u00e3o<\/strong> e IDs fornecidos pelo WordPress.<\/p>\n<p>Assim, usaremos aqueles em nosso c\u00f3digo front-end para exibir os valores.<\/p>\n<h3>Preparando as fun\u00e7\u00f5es de exibi\u00e7\u00e3o<\/h3>\n<p>Normalmente, a\u00a0 fun\u00e7\u00e3o de <strong>widget<\/strong> \u00e9 respons\u00e1vel por exibir a sa\u00edda do widget. Mas uma das coisas que estamos tentando fazer \u00e9 separar as preocupa\u00e7\u00f5es do nosso widget em um conjunto mais focado de classes e fun\u00e7\u00f5es.<\/p>\n<p>A primeira coisa que queremos fazer \u00e9 escrever uma\u00a0 classe <strong>WidgetDisplay<\/strong> que ser\u00e1 respons\u00e1vel por, como \u00e9 evidente, exibir o conte\u00fado do widget.<\/p>\n<p>Por enquanto, isso incluir\u00e1 incondicionalmente o t\u00edtulo, o conte\u00fado e o valor de incluir ou n\u00e3o o t\u00edtulo. O WordPress tamb\u00e9m disponibiliza certos conte\u00fados, como marca\u00e7\u00e3o, que devem aparecer antes e depois do widget, ent\u00e3o vamos incluir isso tamb\u00e9m.<\/p>\n<p>Mas primeiro, vamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-00-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apagar a classe<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\nclass WidgetDisplay\n{\n  private $widgetSlug;\n\n  public function __construct(string $widgetSlug)\n  {\n      $this-&gt;widgetSlug = $widgetSlug;\n  }\n\n  public function show($args, $instance)\n  {\n    \/\/ More to come\n  }\n}\n<\/code><\/pre>\n<p>Depois disso, precisamos ter certeza de que estamos escrevendo para as outras classes tamb\u00e9m. Primeiro, vamos inclu\u00ed <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-01-widget-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">-lo em nossa classe Widget<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function widget($args, $instance)\n{\n    return $this-&gt;widgetDisplay-&gt;show($args, $instance);\n}<\/code><\/pre>\n<p>E ent\u00e3o vamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-02-widget-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">adicion\u00e1-lo \u00e0 classe WidgetAdmin<\/a> (j\u00e1 que \u00e9 onde residem as principais fun\u00e7\u00f5es da API do Widget \u2013 ele apenas delega a responsabilidade \u00e0 classe apropriada):<\/p>\n<pre><code>&lt;?php\n\npublic function __construct($widgetSlug)\n{\n    parent::__construct($widgetSlug);\n    $this-&gt;widgetSerializer = new WidgetSerializer($this-&gt;getWidgetSlug());\n    $this-&gt;widgetDisplay = new WidgetDisplay($this-&gt;getWidgetSlug());\n}<\/code><\/pre>\n<p>Neste ponto, ainda n\u00e3o estamos exibindo nada. Estamos perto e vamos focar nisso em breve.<\/p>\n<h3>Exibindo os dados<\/h3>\n<p>Supondo que voc\u00ea possa adicionar o c\u00f3digo acima sem erros, \u00e9 hora de exibir o conte\u00fado do widget.<\/p>\n<p>Podemos fazer isso de v\u00e1rias maneiras, desde um simples <strong>var_dump<\/strong> at\u00e9 realmente trabalhar para exibir o conte\u00fado de uma maneira mais amig\u00e1vel. E eu sou muito mais f\u00e3 deste \u00faltimo.<\/p>\n<p>Ent\u00e3o vamos fazer isso.<\/p>\n<p>Na\u00a0 fun\u00e7\u00e3o <strong>show<\/strong> da sua\u00a0 classe <strong>WidgetDisplay<\/strong>, adicione <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o seguinte c\u00f3digo<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function show($args, $instance)\n{\n    include_once 'Views\/Widget.php';\n}<\/code><\/pre>\n<p>E ent\u00e3o a visualiza\u00e7\u00e3o do modelo pode ser t\u00e3o simples <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">quanto isto<\/a> :<\/p>\n<pre><code>&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n    &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n    &lt;pre&gt;&lt;?php echo $instance['display-title']; ?&gt;&lt;\/pre&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;<\/code><\/pre>\n<p>Isso garantir\u00e1 que a marca\u00e7\u00e3o adequada para todo o conte\u00fado anterior ao widget, o conte\u00fado do widget e o conte\u00fado sejam renderizados corretamente.<\/p>\n<p>Novamente, lembre-se de que estamos exibindo alguns conte\u00fados que n\u00e3o estar\u00e3o na vers\u00e3o final, mas estamos chegando perto e abordaremos isso no pr\u00f3ximo post.<\/p>\n<p>Eu recomendo brincar com a\u00a0 op\u00e7\u00e3o <strong>Exibir t\u00edtulo<\/strong> para ver como ele \u00e9 renderizado no front-end, considerando a marca\u00e7\u00e3o que fornecemos.<\/p>\n<p>Por enquanto, a sa\u00edda do widget deve ser algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160763-61e7125f80aab.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-160763-61e7125f80aab.png\" alt=\"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 12\" ><\/a><\/p>\n<p>Mas isso \u00e9 tudo que h\u00e1 para cobrir neste post.<\/p>\n<h2>Na refatora\u00e7\u00e3o final<\/h2>\n<p>A \u00faltima coisa que vamos ver depois disso \u00e9 refor\u00e7ar um pouco da l\u00f3gica condicional junto com uma palavra sobre cache de dados (j\u00e1 que j\u00e1 estamos fazendo um pouco disso em posts anteriores).<\/p>\n<p>Por enquanto, fique \u00e0 vontade para brincar com o que temos aqui junto com o c\u00f3digo que n\u00e3o inclu\u00edmos (como o que pode ser exibido antes ou depois do widget.<\/p>\n<p>Eles foram deliberadamente deixados de fora deste exemplo, mas nem sempre podem ser deixados de fora, dependendo do trabalho que voc\u00ea est\u00e1 fazendo.<\/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>Vamos trabalhar na \u00e1rea do c\u00f3digo que renderiza as informa\u00e7\u00f5es para o usu\u00e1rio na \u00e1rea p\u00fablica do site.<\/p>\n","protected":false},"author":1,"featured_media":234985,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,846,867],"tags":[1170],"class_list":["post-231437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231437","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=231437"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231437\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/234985"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}