Dev (Back & Front)ARTIGO

Widgets para o WordPress 2.8

Leia o artigo anterior:

Criando widgets no WordPress e implementando opções

*

Entre as principais melhorias do lançamento da versão 2.8 do WordPress está o novo sistema de widgets. A interface do usuário está muito mais simples de utilizar,
todos os widgets e sidebares ficam listados, basta arrastar um widget
para o sidebar desejado e pronto! O WordPress salva automaticamente o
sidebar e, além disso, os widgets já são multiplicáveis, então não é mais
necessário ficar regulando a divisão deles ou utilizar plugins que
façam a duplicação.

Mas a melhoria não foi só na interface com o usuário; a criação dos
widgets também ficou muito mais simples. O WordPress disponibiliza uma
classe com todo o código bruto para o funcionamento dos widgets
sobrando para o desenvolvedor apenas algumas funções específicas.

A API dos Widgets do WordPress fornece um modelo para a criação dos widgets:

class My_Widget extends WP_Widget {<br />	function My_Widget() {<br />		// widget actual processes<br />	}<br /><br />	function widget($args, $instance) {<br />		// outputs the content of the widget<br />	}<br /><br />	function update($new_instance, $old_instance) {<br />		// processes widget options to be saved<br />	}<br /><br />	function form($instance) {<br />		// outputs the options form on admin<br />	}<br />}<br />register_widget('My_Widget');

Explicando rapidamente, nesse modelo você cria uma classe
‘My_Widget’ filha de uma classe ‘WP_Widget’ que é a classe fornecida
pelo WordPress contendo o código bruto, restando ao desenvolvedor a
definição dos métodos:

My_Widget()

O construtor deve sempre ter o mesmo nome da classe ou se chamar
__construct (depende da versão do PHP). No construtor são definidos o
id, o nome, a descrição, e outras informações relativas ao widget.

widget($args, $instance)

Esse método define a forma como o widget é apresentado no tema. O
parêmetro $args é um array contendo a formatação da estrutura do widget,
como tags de abertura e fechamento e do título do widget,
além do nome e id.

O conteúdo dessa função não muda muito em relação ao modelo anterior
dos widgets que era chamado pelo ‘register_sidebar_widget’, a única
diferença é que o conteúdo da função, antes carregado do banco, agora
vem todo no array $instance.

form($instance)

O método form representa a interface administrativa do widget, onde é
feita a sua configuração. Sua definição não é obrigatória.

Esse método é o espelho da função chamada pelo
‘register_widget_control’, mas aqui fica somente a estrutura do
formulário. Assim como o método ‘widget’, aqui os dados não precisam
mais serem carregados do banco, o array $instance traz todos os dados.
O que notei de diferente na montagem do formulário foram apenas as
nomenclaturas dos campos, agora tendo que ser feita da seguinte forma:

<input type="text" id="<?php print $this->get_field_id('nome-do-campo'); ?>" name="<?php print $this->get_field_name('nome-do-campo); ?>" value="<?php print $instance['nome-do-campo']; ?>" />

update($new_instance, $old_instance)

Também não é necessária a definição do método update. É esse método
que realiza o processamento dos dados antes de salvá-los no banco. O
parâmetro $new_instance contém os dados novos (os que acabaram de ser
informados) enquanto o $old_instance contém os dados antigos, para o
caso de ser necessário fazer uma comparação.

Após o processamento dos dados, um array com os dados finais deverá ser retornado.

Não pretendo explicar novamente a lógica de criação de um widget,
portanto vou simplesmente refazer o widget ‘Posts Mais Quentes’ nesse
novo modelo e caso tenham dúvidas, consultem o artigo anterior.

<?php<br />/*<br />Plugin Name: Widget: Posts mais quentes<br />Description: Lista posts mais comentados<br />Version: 0.3<br />Author: Marcelo Mesquita<br />Author URI: http://www.marcelomesquita.com/<br />*/<br /><br />// Posts Mais Quentes<br />class Widget_Posts_Mais_Quentes extends WP_Widget<br />{<br />	function Widget_Posts_Mais_Quentes()<br />	{<br />		$this->WP_Widget('posts_mais_quentes', 'Posts Mais Quentes');<br />	}<br /><br />	function widget($args, $instance)<br />	{<br />		global $wpdb;<br /><br />		// Valor padrão, caso nada tenha sido informado<br />		if(empty($instance['quantidade'])) $instance['quantidade'] = "5";<br />		// Recuperando os posts<br />		$hot_posts = $wpdb->get_results("SELECT ID, post_title, comment_count FROM {$wpdb->posts} WHERE post_status = 'publish' ORDER BY comment_count DESC LIMIT {$instance['quantidade']}");<br /><br />		if(empty($hot_posts))<br />			return false;<br /><br />		// Usando o modelo de widgets do tema<br />		print $args['before_widget'];<br />		print $args['before_title'] . $instance['titulo'] . $args['after_title'];<br />		print "<ul>";<br />		// Listando os posts mais quentes<br />		foreach($hot_posts as $hot_post)<br />			print "<li><a href='" . get_permalink($hot_post->ID) . "'>{$hot_post->post_title} ({$hot_post->comment_count})</a></li>";<br />		print "</ul>";<br />		print $args['after_widget'];<br />	}<br /><br />	function update($new_instance, $old_instance)<br />	{<br />		return $new_instance;<br />	}<br /><br />	function form($instance)<br />	{<br />		?><br />			<p><br />				<label for="<?php print $this->get_field_id('titulo'); ?>">Título:</label><br />				<input type="text" id="<?php print $this->get_field_id('titulo'); ?>" name="<?php print $this->get_field_name('titulo'); ?>" maxlength="26" value="<?php print $instance['titulo']; ?>" class="widefat" /><br />				<label for="<?php print $this->get_field_id('quantidade'); ?>">Quantidade:</label><br />				<input type="text" id="<?php print $this->get_field_id('quantidade'); ?>" name="<?php print $this->get_field_name('quantidade'); ?>" maxlength="2" value="<?php print $instance['quantidade']; ?>" class="widefat" /><br />			</p><br />		<?php<br />	}<br />}<br />// register widget<br />add_action('widgets_init', create_function('', 'return register_widget("Widget_Posts_Mais_Quentes");'));

Boa sorte!

é formado em Desenvolvimento de Sistemas para a Web e há mais de cinco anos trabalha com desenvolvimento de sites. Nos últimos dois anos tem seu foco no WordPress: montagem de temas, desenvolvimento de plugins, scripts, widgets e performance.

Ver perfil