Já conhecemos o potencial e possibilidades que os widgets do WordPress nos oferecem. Vimos isso aqui no post Elevando o nível do WordPress com Widgets. E no post de hoje, vamos nos aprofundar e conhecer mais possibilidades com essa incrível ferramenta criando nossos próprios widgets.
Antes de começar, precisamos entender como funciona a lógica dos widgets. Para isso, vou descrevê-la em três partes.
Primeira parte – Frontend
No site, os widgets podem assumir uma infinita gama de possibilidades para personalizar e ajudar a deixar o seu projeto ainda mais modular.
O local mais tradicional onde os widgets aparecem é na sidebar (barra lateral) do site. Porém, os widgets não se limitam a isso: podemos colocar widgets em absolutamente qualquer parte do site.
Podemos colocar nesses locais, uma listagem de categorias, um vídeo do YouTube, um calendário de postagens e muitas outras possibilidades. Inclusive, quando você estiver desenvolvendo um projeto e criou, por exemplo, um CPT (Custom Post Type) de eventos, você pode deixar na administração um widget para isso também, que após configurado exibirá os próximos eventos, deixando para o administrador, uma ferramenta que servirá para melhorar a experiência de seus visitantes com isso.
Segunda parte – Administração (wp-admin)
Na administração, os widgets ficam organizados no menu /Aparência/Widgets. Nessa tela você terá a esquerda a listagem de widgets disponíveis no tema que está usando, e a direita as áreas em que pode aplicar esses widgets.
Um item interessante dos widgets é que, uma vez programado, podemos usar uma quantidade ilimitada dele no site. E dependendo das suas configurações, cada um desses pode funcionar de forma específica. Por exemplo, nosso widget de eventos, no blog do site pode exibir uma listagem de todos os próximos eventos. Já na página sobre eventos gratuitos, esse mesmo widget pode exibir apenas eventos que sejam gratuitos (definidos por uma taxonomia por exemplo). O que manda aqui é a necessidade e criatividade.
Terceira parte – A classe Widget (core)
O WordPress possui sua própria classe de widgets, veja sua documentação oficial aqui. E então tudo que faremos será “extendido” dessa classe nativa, assim:
class Custom_Widget extends WP_Widget {}
Muitos frameworks trabalham dessa mesma forma para outras coisas além dos widgets, como CPT, metabox e etc. Esse é o conceito de programação orientada a objetos. O que reduz a quantidade de trabalho, utilizando o recurso de reutilização de códigos.
Com isso, se precisarmos de muitos widgets em um mesmo projeto, podemos criar uma pasta “widgets” em /inc e incluir cada um deles via functions.php. Assim temos um projeto organizado e padronizado, que facilitará a manutenção e entendimento de seus códigos por qualquer pessoa que possa oferecer manutenção.
E nessa etapa a classe que estamos extendendo se divide em outras quatro etapas.
Construção
public function __construct()
Onde fazemos a declaração do widget, adicionando título e descrição Com isso iniciamos a classe Custom Widget e o WordPress se encarrega de adicioná-lo em nossa administração.
Exibição no frontend
public function widget( $args, $instance )
Nessa etapa é onde definimos a estrutura html e os devidos php’s para o widget funcionar da forma esperada no site. Em nosso exemplo de eventos, vamos precisar criar um loop, com o query de eventos e formatar um html para exibi-lo, observando as opções que o widget disponibiliza.
Salvando os dados
public function update( $new_instance, $old_instance )
Com essa função, definimos o módulo para salvar os campos do widget. É aqui onde devemos fazer validação dos campos e então salvar os novos valores.
Formulário na Administração
public function form( $instance )
Nessa função dentro da nossa classe, é onde criamos o formulário com as opções que o seu widget disponibilizará para configuração e personalização do mesmo.
É aqui onde podemoa colocar campos como:
Quantos eventos exibir?
Qual taxonomia?
Adicionar classe CSS
Exibir botão para ver todos?
E então a cada widget utilizado, o administrador poderá personalizar de uma forma específica para cada área. Novamente o que manda aqui é sua criatividade e necessidade. Imagine que ainda é possível adicionar um campo para condicionar quando esse widget deve ser inserido. Por exempli, é muito comum sites que só possuem uma área para wídgtes em todas as páginas, e então com esse campo você pode determinar se ele deve aparecer em archives, singles ou determinadas categorias do blog.
Basicamente a classe que estamos extendendo precisa apenas dessas quatro funções para funcionar perfeitamente. Vale navegar um pouco pela documentação oficial e entender melhor o seu funcionamento. E no mesmo arquivo que estamos criando, fora da classe Custom_Widget, precisamos registrar o widget adicionando uma função no action ‘widgets_init’.
add_action( 'widgets_init', 'custom_register_widgets' );
Abaixo veja como ficou nosso exemplo de widget para exibição de eventos.
public function __construct() { $widget_ops = array( 'classname' => 'Eventos_Widget', 'description' => 'Widget para adicionar um calendário de Eventos' );
parent::__construct( ‘Eventos_Widget’,’Calendário de Eventos’, $widget_ops );
}
public function widget( $args, $instance ) {
$title = apply_filters( ‘widget_eventos_title’, empty( $instance[‘title’] ) ? ” : $instance[‘title’], $instance, $this->id_base );
$qtd_eventos = apply_filters( ‘widget_eventos_qtd’, empty( $instance[‘qtd_eventos’] ) ? ” : $instance[‘qtd_eventos’], $instance );
echo ‘