A criação de widgets em WordPress não é tão difícil como à partida se poderá pensar, e neste artigo vamos ajudá-lo a criar um widget para a sua rede de blogs. Uma rede de blogs em WordPress pode ser uma rede ao estilo das Escolas+ em que há um conceito no qual assentam as várias escolas da rede, formando assim um grupo de websites em WordPress. A utilidade deste widget pode simplesmente passar por dar a conhecer aos seus visitantes os restantes websites que você tem na sua rede, facilitando assim a navegação entre estes e espalhando a palavra, dando a conhecer a sua existência. Os colegas do WPTuts forneceram este código para que todo o mundo possa criar o seu próprio widget. Para o correto funcionamento do mesmo, você deverá já ter criado uma rede de blogs através do WordPress MU, o qual poderá aprender seguindo o nosso guia Guia para Configurar o WordPress Multisite.
1. CRIANDO AS BASES PARA O WIDGET
Como referimos, você já deverá ter criado anteriormente uma rede de websites em WordPress. Comece por criar o ficheiro mynetwork.php e insira o seguinte código:
/* Plugin Name: Nome do seu Plugin Plugin URI: http://www.websiteDoSeuPlugin.com/ Description: Descrição Author: Nome do Autor Version: Versão (ex: 1.01) Author URI: http://www.websiteDoAutor.com/ */ class MyNetwork_Widget extends WP_Widget { public function __construct() { // widget actual processes } public function form( $instance ) { // outputs the options form on admin } public function update( $new_instance, $old_instance ) { // processes widget options to be saved } public function widget( $args, $instance ) { // outputs the content of the widget } } add_action( 'widgets_init', create_function( '', 'register_widget( "mynetwork_widget" );' ) );
Neste trecho de código, a função add_action(‘widgets_init’) é utilizada para fazer o registro do widget da rede de blogs!
2. A FUNÇÃO CONSTRUCT
Já criámos a base deste widget, e agora é hora de começar a entrar no núcleo do mesmo. Vamos adicionar as suas funcionalidades, começando por adicionar um atributo denominado blogs, que irá ser utilizado como um array onde irá ser inserida a lista de blogs da rede:
class MyNetwork_Widget extends WP_Widget { public $blogs = null;
O próximo passo é adicionar mais elementos à função construct. Atribuiremos um array dos blogs ao atributo utilizando a funçãoo get_blog_list. Assim, cada vez que pretendermos fazer uma referência a este array, basta utlizarmos $this->blogs
public function __construct() { $this->blogs = get_blog_list( 0, 'all' );
Por ultimo, iremos fazer a chamada à função construtora e inserir informações acerca do widget. Esta função contará com os elementos ID, Name, Options e Control Options. Estas informações irão ser apresentadas no painel do widget:
parent::__construct( 'mynetwork_widget', // Base ID 'MyNetwork_Widget', // Name array( 'description' => __( 'Display List of Blogs in Site Network', 'text_domain' ) ) ); }
3. CRIAR O FORMULÁRIO DO WIDGET
Neste passo iremos criar o formulário que irá estar presente no painel de administração. O formulário irá contar com um campo Image URL para você inserir o logo de cada um dos blogs da rede ao estilo thumbnail. A primeira coisa a fazer é criar um loop que irá fazer um ciclo em cada um dos blogs, o qual não irá contar com o nome do blog que irá ser introduzido através da função get_blog_details. Assim, a função irá buscar o id do blog e irá retornar o nome, o ID, o número de artigos, o caminho e outras informações úteis. O nome de cada um dos blos irá ser inserido acima de cada um dos campos onde irá inserir o URL:
public function form( $instance ) { // outputs the options form on admin foreach ($this->blogs AS $blog) { $image = $instance['image-'.$blog['blog_id']]; ?> <p> <label><strong><?php echo get_blog_details($blog['blog_id'])->blogname; ?></strong></label><br /> <label for="<?php echo $this->get_field_id( 'image-'.$blog['blog_id'] ); ?>"><?php _e( 'Image Url:' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'image-'.$blog['blog_id'] ); ?>" name="<?php echo $this->get_field_name( 'image-'.$blog['blog_id']); ?>" type="text" value="<?php echo esc_attr( $image ); ?>" /> </p> <?php } }
4. CRIAR A FUNÇÃO UPDATE
A função update irá guardar os valores inseridos no formulário presente no painel de administração. Primeiro criamos a variável $instance como array, e de seguida irá ser feito um novo loop em cada blog:
public function update( $new_instance, $old_instance ) { // processes widget options to be saved $instance = array(); foreach ($this->blogs AS $blog) { $instance['image-'.$blog['blog_id']] = strip_tags( $new_instance['image-'.$blog['blog_id']]); } return $instance; }
5. CRIAR A FUNÇÃO DO WIDGET
Agora que temos a função que irá fazer a renderização HTML do widget, está na altura de criar mais alguns itens que irão finalizar o widget. Criamos um loop que ira trabalhar nos blogs registados e para cada um deles irá ser definida a imagem, o link e o nome do blog. Adicionamos também um if que irá certificar se o URL para a imagem foi inserido no painel de controlo do widget, e caso isso não se verifique, esse blog não irá ser apresentado na lista. Adicionamos também algum código HTML para inserir hiperligação em cada uma das imagens da rede de blogs:
public function widget( $args, $instance ) { // outputs the content of the widget foreach ($this->blogs AS $blog) { $image = $instance['image-'.$blog['blog_id']]; $link = $blog['path']; $name = get_blog_details($blog['blog_id'])->blogname; if ($image) { ?> <div> <div> <a href="<?php echo $link; ?>"><img src="<?php echo $image; ?>" width="125" border="0" alt="<?php echo $name; ?>" /></a> </div> <div><h3><?php echo $name; ?></h3></div> </div> <?php } } }
E está finalizado o Widget!
6. CÓDIGO COMPLETO
Caso seja mais fácil para si pegar o código completo e compreendê-lo, ou simplesmente não pretende estar a juntar todo o código que fomos fornecendo ao longo deste tutorial, deixamos-lhe abaixo o código completo que poderá utilizar para criar o seu widget:
<?php /** * @package MyNetwork * @version 1.0.0 */ /* /* Plugin Name: Nome do seu Plugin Plugin URI: http://www.websiteDoSeuPlugin.com/ Description: Descrição Author: Nome do Autor Version: Versão (ex: 1.01) Author URI: http://www.websiteDoAutor.com/ */ ?> <?php class MyNetwork_Widget extends WP_Widget { public $blogs = null; public function __construct() { $this->blogs = get_blog_list( 0, 'all' ); parent::__construct( 'mynetwork_widget', // Base ID 'MyNetwork_Widget', // Name array( 'description' => __( 'Display List of Blogs in Site Network', 'text_domain' ) ) // Args ); } public function form( $instance ) { // outputs the options form on admin foreach ($this->blogs AS $blog) { $image = $instance['image-'.$blog['blog_id']]; ?> <p> <label><strong><?php echo get_blog_details($blog['blog_id'])->blogname; ?></strong></label><br /> <label for="<?php echo $this->get_field_id( 'image-'.$blog['blog_id'] ); ?>"><?php _e( 'Image Url:' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'image-'.$blog['blog_id'] ); ?>" name="<?php echo $this->get_field_name( 'image-'.$blog['blog_id']); ?>" type="text" value="<?php echo esc_attr( $image ); ?>" /> </p> <?php } } public function update( $new_instance, $old_instance ) { // processes widget options to be saved $instance = array(); foreach ($this->blogs AS $blog) { $instance['image-'.$blog['blog_id']] = strip_tags( $new_instance['image-'.$blog['blog_id']]); } return $instance; } public function widget( $args, $instance ) { // outputs the content of the widget foreach ($this->blogs AS $blog) { $image = $instance['image-'.$blog['blog_id']]; $link = $blog['path']; $name = get_blog_details($blog['blog_id'])->blogname; if ($image) { ?> <div> <div> <a href="<?php echo $link; ?>"><img src="<?php echo $image; ?>" width="125" border="0" alt="<?php echo $name; ?>" /></a> </div> <div><h3><?php echo $name; ?></h3></div> </div> <?php } } } } add_action( 'widgets_init', create_function( '', 'register_widget( "mynetwork_widget" );' ) ); ?>
Abraço!