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!







