Crear un plugin para wordpress

Recientemente he programado un plugin para wordpress que permite una integración limpia y eficiente con paypal, también posibilita una amplia personalización desde el panel de opciones del propio wordpress.

Concluido el plugin voy a compartir lo aprendido 😉 pero en su versión resumida. Intentare explicar como crear un plugin, hacer uso de shortcode e integrar una página de opciones en el panel de administración de wordpress, aunque todo ello de forma sencilla y bastante esquematizada, a partir de ahí nuestra imaginación hará el resto.

Antes de comenzar, demos una vuelta por la wikipedia para conocer ¿que es un plugin? y recordar como son gestionados en wordpress.

1.- Crear el fichero contenedor del plugin (para wordpress)

Por ejemplo: “miplugin.php”, su contenido debe ajustarse al formato siguiente:

/*
Plugin Name: nombre de nuestro plugin
Plugin URI: web del plugin (descarga, soporte, etc.)
Description: descirpción detallada del plugin
Author: nombre y apellidos del autor
Version: 1.0
Author URI: web del autor
*/

/*
Licencia
*/

2.- Vamos a programar!

Las siguientes lineas ya deben contener el código de nuestro plugin.

Empiezo por escribir el esqueleto principal del programa, la clase con algunas variables y funciones.

class miplugin {
	var $opt;
	var $table_name;
	
	// inicializamos plugin
	function miplugin() { }
	// instalar cosas del plugin
	function install() { }
	// desinstalar
	function uninstall() { }
	// página de configuración
	function config_page() { }
	//opciones de configuración
	function options_plugin() { }
	//ejecuta resultado
	function init() { }
}

$mp = new miplugin();

Como se observa, el plugin se encuentra bajo POO pero por razones de compatibilidad no usa las características de PHP5, es por ello que se hace uso de “var” para declarar las variables y “__construct” ha sido remplazado por el nombre del plugin en la función de inicialización.

La línea 19 es la encargada de crear un objeto “mp” de la clase “miplugin”. A partir de aquí empieza la faena 😉

3.- Inicializamos el plugin

function miplugin() {
	global $wpdb;
	
	$this->table_name = $wpdb->prefix.'miplugin';
	
	register_activation_hook(__FILE__, array(&$this, 'install')); //gancho para instalar
	register_deactivation_hook(__FILE__, array(&$this, 'uninstall')); //gancho para desinstalar
	
	add_action('admin_menu', array(&$this, 'config_page'));
	add_shortcode('mundo', array(&$this, 'init'));
}

Esta función es ejecutada automáticamente cuando se crea un objeto de la clase, puesto que tiene el mismo nombre.

En la línea 2 tomamos el objeto $wpdb; que es el encargado de llevar la gestión de bases de datos para wordpress. Siempre que queramos interactuar con la base de datos de wordpress será necesaria esta llamada.

En la línea siguiente almacenamos en “$this->table_name” el nombre de la tabla para nuestro plugin.

Con register_activation_hook y register_deactivation_hook podemos indicar que funciones deben ejecutarse “installa/uninstall” cuando el plugin sea activado/desactivado desde el panel de administración de wordpress.

La línea 6 se encarga de implementar la función “config_page” que debe llamarse para que podamos tener un menú de opciones del plugin integrado en wordpress (solapa opciones). Para ello debe hacerse uso de la función de wordpress add_action.

La línea 7 hace que podamos usar las shortcodes (códigos rápidos) como llamadas al plugin. Esto hace que por ejemplo cuando se escribe “[mundo]” en el contenido de un post, el plugin llame a la función “init” puesto que ha sido implementado con add_shortcode.

4.- Instalar/desinstalar

Hacemos un alto en el proceso anterior para comentar las funciones install/uninstall.

function install() {
	global $wpdb;
	
	$sql = 'CREATE TABLE `'.$this->table_name.'` (
		`frase` varchar(100) NOT NULL default ""
	) ENGINE=MyISAM DEFAULT CHARSET=utf8';
	
	$wpdb->query($sql);
	$wpdb->query('INSERT INTO `'.$this->table_name.'` SET frase = "hola mundo!!!"');
}

Aquí va la creación de la tabla para el plugin en la base de datos de wordpress. A continuación inserté un registro donde uno de los campos contiene el valor “hola mundo!!!”.

function uninstall() {
	global $wpdb;
	
	$sql = 'drop table `'.$this->table_name.'`';
	$wpdb->query($sql);
}

Cuando desinstalamos el plugin se ejecuta la función “uninstall” y con ella procesamos el borrado de la tabla del plugin.

5.- Página de configuración del plugin

function config_page() {
	add_options_page('mi plugin', 'mi plugin', 8, 'miplugin_options', array(&$this, 'options_plugin'));
}

function options_plugin() {
	global $wpdb;
	
	if (isset($_POST['update'])) {
		//aquí podemos poner el sql update, basado en los datos de un formulario
	}

	//aquí va el formulario para las opciones de configuración
}

La ya mencionada función ” add_action(‘admin_menu’, array(&$this, ‘config_page’));” ejecutada en la inicialización del plugin, es la encargada de indicar que debe procesarse la función “config_page” que a su vez pide las opciones que debe contener el plugin a “options_plugin”.

6.- Resultado del shortcode

function init($atts) {
	global $wpdb;

	// options (config)
	$this->opt = $wpdb->get_row('SELECT * FROM '.$this->table_name.' LIMIT 1', ARRAY_A);
	
	// atributes (user)
	extract(shortcode_atts(array('frase' => $this->opt['frase']), $atts));
	include('fichero.php');
}

Volviendo al proceso del programa, cuando se escribe en un post el shortcode “[mundo]” se ejecuta la función “init” y se le pasa como parametro el shortcode con sus atributos “$atts“.

[mundo] //esto es un shortcode
[mundo frase="hola mundo 2!!!"] //esto es un shortcode con un atributo

Esta función “init($atts)” se encarga de hacer una consulta sql “select” a la tabla del plugin y obtener la frase “hola mundo!!!” que tenemos almacenada.

A continuación la función “extract(shortcode_atts(array(‘frase’ => $this->opt[‘frase’]), $atts));”, es crucial puesto que se encarga de “repartir” los pares de valores tomados de los atributos.

Es por esto que podamos contener en la variable $frase = “hola mundo!!!” (en caso de que se llamará al shortcode sin atributo) o “hola mundo 2!!!” si se ha llamado con el atributo.

Por último y para separar un poco el html del php, pongo un “include” que llama a un fichero.php (debe estar en el mismo directorio que el plugin) .

//fichero.php

El fichero muestra la frase.

Consejos

  • Creo que es importante emplear cierto tiempo en buscar nombres originales para nuestras funciones y variables (sobre todo si se programe de forma estructurada y no orientada a objetos), puesto que debemos tener en cuenta la compatibilidad con otros plugins y el propio código de wordpress.
  • Se puede aprender un montón de cosas viendo el código ordenado de algunos plugins 😉

Recursos

6 responses to “Crear un plugin para wordpress

  1. Muy buen manual para empezar a programar un plugin de WP. Yo estuve intentando encontrar algo como esto hace unas semanas y no encontré nada en español, al final peleándome con el código y con google di con lo que hacer.

    Esto me hubiera venido genial :).

    Saludos.

  2. Buen tutorial. Eres el primero que encuentro y que utiliza POO en un plugin. Me gustó mucho la estructura de la clase.

    Podrias poner un ejemplo como trabajar con varias clases en distintos archivos .php?. Como incluyo una clase dentro de otra?

    Un saludo.

  3. Excelente tutorial.. igual yo estaba buscando un tutorial que me expusiera las bases de la creacion de un plugin.. y te felicito.. abarcaste mas informacion que las demas paginas.. si tienes o haces otro tutorial mas completo o relacionado sin duda lo leeria.. saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *