Widgets do WordPress: Refatoração, Parte 13
Estamos finalmente no post final da série sobre refatoração do WordPress Widget Boilerplate. Ao final deste post, teremos o branch de desenvolvimento do nosso código pronto e estaremos prontos para mesclar tudo no branch master.
No entanto, ainda há um pouco de trabalho a fazer. A saber :
A última coisa que vamos ver depois disso é reforçar um pouco da lógica condicional junto com uma palavra sobre cache de dados (já que já estamos fazendo um pouco disso em posts anteriores).
Então, essas são as duas coisas que veremos neste post. Especificamente, veremos como lidar com a lógica condicional para o front-end e como implementar o cache básico.
The WordPress Widget Boilerplate: Refatorando Parte 13
Antes de entrarmos na rodada final de detalhes, quero ter certeza de que você está executando a versão mais recente do código, pois esta é a única vez em que acredito ser imperativo ter o código pronto para a rodada final de alterações.
Então, se você não tem o código rodando em sua máquina, agora é a hora. A última parte do código em que precisamos trabalhar é bem pequena.
Mas é importante certificar-se de que você está executando a versão mais recente. Assim que você fizer um pull do código mais recente, estamos prontos para encerrar isso.
1 Renderizando o Front-End
Lembre-se que no post anterior, renderizamos informações gerais do widget – o título, o conteúdo e se o título deve ou não ser exibido – simplesmente exibindo os valores no front-end.
Mas agora é hora de configurar as informações para ter certeza de que não vamos apenas renderizar as informações com base nas opções na área de administração do widget, mas também se houver alguma informação.
Então vamos começar com a opção mais simples: A opção que nos permite alternar se o título é exibido. Em outras palavras, vamos supor se os valores estão preenchidos e essa opção está marcada no backend.
Lembre-se, o arquivo Widget.php atualmente se parece com isso :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<div id="<?php echo $args['id']; ?>">
<h3 class="widget-title"><?php echo $instance['title']; ?></h3>
<p><?php echo $instance['content']; ?></p>
<pre><?php echo $instance['display-title']; ?></pre>
</div><!-- #<?php echo $args['id']; ?>-->
Então, vamos refatorar essa parte primeiro. Claro, é uma coisa relativamente fácil de introduzir, certo? Ou seja, a lógica fica assim:
- Se a opção para exibir o título estiver marcada, mostramos o título; caso contrário, nós não.
Isso pode ser resolvido com uma simples instrução if, avaliando o valor da opção display-title que temos. Devido à maneira como construímos a função ao longo desta série, se a opção estiver marcada, ela terá a opção on ; caso contrário, está vazio.
Isso significa que podemos configurar uma condicional como esta no mesmo código que compartilhamos acima :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<div id="<?php echo $args['id']; ?>">
<?php if (isset($instance['display-title']) && 'on' === $instance['display-title']): ?>
<h3 class="widget-title"><?php echo $instance['title']; ?></h3>
<?php endif; ?>
<p><?php echo $instance['content']; ?></p>
</div><!-- #<?php echo $args['id']; ?>-->
Dessa forma, se a opção estiver marcada, o título será exibido.
Um corolário disso
Uma coisa que acho que vale a pena mencionar é que há momentos em que as pessoas podem ativar widgets, mas optam por não ter conteúdo. Claro, você pode argumentar que se eles fazem isso, então a culpa é deles.
Há verdade nisso.
Mas também acho que cuidar de usuários que podem estar descobrindo as coisas ou que podem ter feito acidentalmente algo que eles não sabiam pode ajudá-los. Talvez isso nos torne desenvolvedores responsáveis (ou talvez nos torne mais agressivos – faça a sua escolha, estou com o primeiro).
Então, neste caso, acho que vale a pena garantir que o título e o conteúdo não estejam vazios. Se estiverem, então não renderize nada.
O código então fica assim :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<?php if (empty($instance['title']) && empty($instance['content'])): return;
endif; ?>
<div id="<?php echo $args['id']; ?>">
<?php if (isset($instance['display-title']) && 'on' === $instance['display-title']): ?>
<h3 class="widget-title"><?php echo $instance['title']; ?></h3>
<?php endif; ?>
<p><?php echo $instance['content']; ?></p>
</div><!-- #<?php echo $args['id']; ?>-->
E isso encerrará isso no que diz respeito ao front-end. Mas e o cache de que falamos em um post anterior?
2 Apresentando o Cache
O armazenamento em cache, para um widget como este, é algo que considero opcional, mas como construímos a funcionalidade básica no Boilerplate para liberar o cache, segue logicamente a introdução da funcionalidade de armazenamento em cache de dados, certo?
Então vamos fazer isso. Também não deve ser difícil. Na realidade, estamos simplesmente pegando o título, o conteúdo e a caixa de seleção e armazenando em cache os valores para a instância dada do widget.
Para fazer isso, precisamos localizar a função do widget e fazer o seguinte:
Primeiro, apresentaremos uma função para armazenar em cache o widget :
<?php
/**
* Caches the values for the instance of this widget.
*
* @param array $args argument provided by WordPress that may be useful in rendering the widget
* @param array $instance the values of the widget
*/
private function cacheWidget($args, $instance)
{
$cache = [];
$cache['widget_id'] = $args['widget_id'];
$cache['title'] = empty($instance['title'])? '': $instance['title'];
$cache['content'] = empty($instance['content'])? '': $instance['content'];
$instance['display-title'] = isset($instance['display-title'])? $instance['display-title']: '';
$cache['display-title'] = $instance['display-title'];
wp_cache_set($this->getWidgetSlug(), $cache, 'widget');
}
Em seguida, apresentaremos uma função para recuperar a versão em cache do widget :
<?php
/**
* @return array the cached instance of this widget if it's not empty
*/
private function getCachedWidget()
{
$cache = wp_cache_get($this->getWidgetSlug(), 'widget');
if (!empty($cache)) {
return $cache;
}
return [];
}
Em seguida, revisitamos a função original para garantir que estamos exibindo o que é necessário. Se o cache estiver vazio, não faremos nada além de exibir os valores como estão.
<?php
/**
* Displays the widget based on the contents of the included template.
*
* @param array $args argument provided by WordPress that may be useful in rendering the widget
* @param array $instance the values of the widget
*/
public function widget($args, $instance)
{
// Get a cached version of the widget. If it's empty, cache what we have.
$cache = $this->getCachedWidget();
if (empty($cache)) {
$this->cacheWidget($args, $instance);
}
return $this->widgetDisplay->show($args, $instance);
}
E isso encerra a funcionalidade do Widget Boilerplate completamente refatorado.
O fim
Este grave em particular tem sido longo. Pessoalmente, foi muito bom revisitar o WordPress Widget Boilerplate e trazê-lo para padrões mais modernos.
Ainda há algumas coisas que preciso fazer, como atualizar o arquivo README e fornecer mais algumas instruções antes de mesclá-lo no branch master, mas se você estiver acompanhando toda esta série, provavelmente estará a bordo com tudo. Além disso, aprecio seu tempo em conviver com ele e espero que tenha sido benéfico para você em alguns níveis.
Com isso dito, procurarei migrar para conteúdo premium de formato mais curto, já que esta série e a última foram bastante longas. Como de costume, você sempre pode entrar em contato comigo ou oferecer solicitações de pull conforme necessário – é de código aberto e também recebe melhorias.
Por enquanto, porém, isso encerra esta série.