Como crear un widget en Wordpress con Widget API
Con la versión de Wordpress 2.8 se incorpora una API que facilita la tarea de crear un widget.
Con la intención de mostrar una imagen aleatoria en la barra lateral me dije voy a descargarme un widget que lo haga pero los que probé tenian alguna que otra pega y para no andar modificandolos dije: “Hagamos uno” y eso haremos.
Lo que mostrare aquí como la intención básica es crear el widget en sí más que lo que muestre hagamos un simple Hola Mundo Widget.
No llevará mas de un archivo php y se podría crear un simple plugin formado por un solo archivo pero por si acaso en un futuro se añadiesen mas ficheros lo mejor sería crear un directorio con el nombre del plugin y dentro el fichero.
En nuestro caso llamamos al directorio y fichero adi-hola-mundo-widget (el nombre es lo de menos pongo adi delante para evitar que ningún otro plugin se llame así)
Y dentro del empezamos a escribir:
Primero añadimos la información de nuestro widget que sera la que se mostrara en el listado de widget de nuestro wordpress
<?php
/*
* Plugin Name: Hola Mundo Widget
* Version: 1.0
* Plugin URI: http://www.aprendizdeilusiones.com/2010/03/07/otros/como-crear-un-widget-en-wordpress-con-widget-api/
* Description: Widget de ejemplo con la nueva API Widget
* Author: Aprendiz de Ilusiones
* Author URI: http://www.aprendizdeilusiones.com
*/
?>
Ahora crearemos nuestro widget. Con la esta API podemos crear una clase que extienda de WP_Widget con tres funciones (constructor (que sera igual que el nombre de la clase), widget, update y form)
<?php
class AdiHolaMundoWidget extends WP_Widget {
//Constructor
function AdiHolaMundoWidget () {
}
//Como se mostrara el widget en la web
function widget($args, $instance) {
}
//Función para guardar la configuración del widget en el panel de control
function update($new_instance, $old_instance) {
}
//Muestra el formulario del widget en el panel de control
function form($instance) {
}
}
?>Ahora veamos las funciones paso por paso.
<?php
function AdiHolaMundoWidget() {
//Clase CSS que usara el widghet y la descripción que se mostrará en la selección de widget en el Panel de Control
$widget_ops = array( 'classname' => 'adiHolaMundo', 'description' => __('Widget de ejemplo') );
//Configuración del widget en el panel de control.
$control_ops = array( 'width' => 200, 'height' => 350);
// Creamos el widget. El idbase que se usa en el formulario de configuración, Titulo del Widget en el panel de control,
// y las opciones del widget y en control
$this->WP_Widget( 'idAdiHolaMundoWidget', __('Adi Hola Mundo Widget'), $widget_ops, $control_ops );
}
?>El detalle a tener en cuenta como ya he dicho antes es que el constructor tenga el mismo nombre de la clase (como en casi cualquier lenguaje de programación), lo demás tampoco hay que darle mucha mas vuelta…. Copiar, Pegar y Editar con lo que se quiera
<?php
/**
* Como se mostrara el widget en la web
*/
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters('widget_title', $instance['title'] );
$nombre= $instance['nombre'];
echo $before_widget;
/* Nuestro widget */
if ( $title )
echo $before_title . $title . $after_title;
echo "Hola Mundo soy ".$nombre;
echo $after_widget;
}
?>Con esta función configuramos el widget como aparecerá en la barra de widget de la página web. Las opciones $before_widget,$after_widget,$before_title y $after_title son valores que se configuran el theme cuando registras las sidebar. (Siempre las he visto en el fichero functions.php)
<?php
/**
* Funcion para guardar la configuración del widget en el panel de control
*/
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
//Usar strip_tags y stripslases para controlar el texto insertado en los campos de texto
$instance['title'] = strip_tags( stripslashes($new_instance['title'] ));
$instance['nombre'] = strip_tags( stripslashes($new_instance['nombre'] ));
return $instance;
}
?>Una función muy sencillita que lo unico que tenemos que hacer es actualizar los nuevos valores de la configuración. Aquí es donde tenemos que comprobar que los datos introducidos sean los correctos. Si pide un valor que el usuario no introduzca un texto… esos fallos que nunca se comprobaban en programación y la profesora te echaba bronca y tu decías.
“Pero profe no creo que el usuario sea tan estúpido, si pone introduce un número y pulsa una letra… ajo y agua.” Pero no, no colaba
<?php
/**
* Muestra el formulario del widget en el panel de control
*/
function form( $instance ) {
//Establecemos algunos datos por defecto
$defaults = array( 'title' => __('Ejemplo del Hola Mundo'), 'nombre' => __('Aprendiz'));
$instance = wp_parse_args( (array) $instance, $defaults );
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Titulo:'); ?></label>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
</p>
<p>
<label for="<?php echo $this->get_field_id( 'nombre' ); ?>"><?php _e('nombre:'); ?></label>
<input id="<?php echo $this->get_field_id( 'nombre' ); ?>" name="<?php echo $this->get_field_name( 'nombre' ); ?>" value="<?php echo $instance['nombre']; ?>" style="width:100%;" />
</p>
<?php
}
?>Y el método que faltaba, que sirve para mostrar la configuración del widget en el panel de control.
Primero creamos los valores por defecto y los inicializamos en la instancia y luego el formulario con las etiquetas y campos que queramos sin preocuparnos por los botones de guardar ni borrar. Para las id y nombres del campo mejor usar las nuevas funciones get_field_id() y get_field_name().
Finalmente debemos decirle a Wordpress que registre nuestro widget cuando inicialice los widget.
<?php
add_action( 'widgets_init', 'adiHolaMundoWidget_load' );
function adiHolaMundoWidget_load() {
register_widget( 'AdiHolaMundoWidget' );
}
?>Cuando wordpress inicialice los widgets con widgets_ini llamara a nuestra función y con register_widget registrará el nuestro
El código completo:
- <?php
- /*
- * Plugin Name: Adi Hola Mundo Widget
- * Version: 1.0
- * Plugin URI: http://www.aprendizdeilusiones.com/2010/03/07/otros/como-crear-un-widget-en-wordpress-con-widget-api/
- * Description: Widget de ejemplo con la nueva API Widget
- * Author: Aprendiz de Ilusiones
- * Author URI: http://www.aprendizdeilusiones.com
- */
- ?>
- <?php
- class AdiHolaMundoWidget extends WP_Widget {
-
- function AdiHolaMundoWidget() {
- //Clase CSS que usara el widghet y la descripción que se mostrará en la selección de widget en el Panel de Control
-
- //Configuración del widget en el panel de control.
-
- // Creamos el widget. El idbase que se usa en el formulario de configuración, Titulo del Widget en el panel de control,
- // y las opciones del widget y en control
- $this->WP_Widget( 'idAdiHolaMundoWidget', __('Adi Hola Mundo Widget'), $widget_ops, $control_ops );
- }
-
- /**
- * Como se mostrara el widget en la web
- */
- function widget( $args, $instance ) {
-
- $title = apply_filters('widget_title', $instance['title'] );
- $nombre= $instance['nombre'];
-
- echo $before_widget;
-
- /* Nuestro widget */
- if ( $title )
- echo $before_title . $title . $after_title;
-
- echo "Hola Mundo soy ".$nombre;
-
- echo $after_widget;
- }
-
- /**
- * Funcion para guardar la configuración del widget en el panel de control
- */
- function update( $new_instance, $old_instance ) {
- $instance = $old_instance;
-
- //Usar strip_tags y stripslases para controlar el texto insertado en los campos de texto
-
- return $instance;
- }
-
- /**
- * Muestra el formulario del widget en el panel de control
- */
- function form( $instance ) {
-
- //Establecemos algunos datos por defecto
- ?>
-
- <p>
- <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Titulo:'); ?></label>
- <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
- </p>
- <p>
- <label for="<?php echo $this->get_field_id( 'nombre' ); ?>"><?php _e('Nombre:'); ?></label>
- <input id="<?php echo $this->get_field_id( 'nombre' ); ?>" name="<?php echo $this->get_field_name( 'nombre' ); ?>" value="<?php echo $instance['nombre']; ?>" style="width:100%;" />
- </p>
- <?php
- }
- }
- add_action( 'widgets_init', 'adiHolaMundoWidget_load' );
-
- function adiHolaMundoWidget_load() {
- register_widget( 'AdiHolaMundoWidget' );
- }
- ?>





Estamos empezando a trabajar con wordpress a fondo y este post es el más completo y mejor explicado que he visto.Muchas gracias.
Ya que estoy… estoy intentando añadir un campo propio al widget texto para que coja la clase que yo le diga. Podría crearme uno desde cero, pero me gustaría entender mejor el motor de WordPress. ¿Como puedo modificar el widget Text que viene por defecto? ¿Dónde está ese código?¡¡Muchas gracias de todas formas!!
Pues resulta que ya lo he encontrado.
Conclusión: He tenido una conversación yo solo en los comentarios jajajaja
¡Tu blog me gusta mucho. Si necesitas una mano en lo que sea me avisas!
Jaja no me ha dado tiempo ni ha ducharme xDBueno el tema este es de la 2.8 ahora ya va por 3.0.5 no se si habrá cambiado todavía no he hecho ningun widget.
Me alegro que te guste lástima que no tenga tiempo para nada y para variar lo deje a medias :/ Llevo un año sin tocar este blog
Igual en breve que me dan vacas permanentes…. jaja
Creo que el Widget Texto permite html… así que con poner < p class="laquesea" > te valdría no?
Yo cuando tengo alguna duda sobre algun plugin o tal… me bajo uno parecido y miro el código… jeje algo en claro se sacará.
Suerte con wordpress se pueden hacer cosas muy interesantes
Si, lo quería para prepararselo a un cliente. En la plantilla hay 3 tipos de títulos según la importancia de la sección. Pero modificando el formulario de la clase en defatult-widgets.php ha sido facil… pero gracias a tu entrada!! jajajaja.Donde puedo meter los estilos css para este widget, por ejemplo quiero hacer un widget y que tengas sus propios estilos, que el usuario solo tenga que instalarlo.Buenas… la verdad que tengo esto un poco olvidado la verdad.. ahora toy con objetive-c a ver cuanto duro jaja… no me acuerdo si hay una opcion en el widget para añadir una oja de estilos a la cabecera como ocurria con los plugins pero supongo que para salir del paso se podría añadir los estilos entre las etiquetas
no?
jejeje, si eso he hecho es la mas rápida solución, pregunte para saber si había otra solución más profesional por que quiero liberal el widget, no es nada del otro mundo pero bueno, muchas gracias de todas formas.Se me fue la pinza cuando te conteste… que todo widget es un plugin en sí, y mira que estoy tocando código pero que nose lo lei por encima o estaría dormido no lo entiendo pero bueno te digo, igual hay algo mejor, pero yo lo tengo así.lo que hace eso es ejecutar la función que tu le digas cuando se carga wp_head que al ser dentro de la cabecera de la web pues puedes añadir el código de tu css. Eso sí, si lo hacemos de la otra forma el codigo css solo se usará cuando se vea el widget de esta se vería siempre, estuviera o no el widget
for your new object you call extend ..YAHOO.lang.extend YAHOO.SATYAM.LoadingPanel YAHOO.widget.Panel ..The sequence of first defining the constructor for the new object and then..extending it with the base object may seem counterintuitive when read in a linear fashion. We..dont use the optional argument a string that would become the id of the HTML..element that our widget will create. As with all YUI widgets we accept either an actual DOM reference or the id..attribute of an HTML element.Hola he visto tu blog y he pensado que a lo mejor te interesaría participar en nuestra Revista. Es una revista de relatos fantásticos e ilustrados, que si sabes lo que significa Pulp no tendré nada más que explicarte. Buscamos más escritores e ilustradores, gente que quiera ver algo de ellos plasmado en un tomo físico. Si tu relato es publicado recibirás gratis en tu casa el número de la revista en donde haya aparecido. ¿Te intera? Si es así, entra en nuestra web, “estramboticos.es” y déjanos un comentario en el apartado epístolas. Un saludo