Blog what I write

Crear un plugin para wordpress

post - - 6 replies -

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

  • 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.

  • bastante bueno tu articulo y tu codigo es muy claro.

    gracias

  • 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.

  • 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

  • Excelente tutorial, era lo que estaba buscando muchas gracias!

  • Pingback: Crear Plugins Wordpress ← Tutoriales de programaci贸n()