Jul 28 2008

Como hacer un plugin para Wordpress {

Tag: PHP, Wordpress

Luego de escribir mi primer plugin, voy a explicar a grandes rasgos lo que se necesita para escribir un plugin, éste está compuesto de 2 archivos, uno con la funcionalidad del plugin y otro con la página de opciones para el panel de administración de wordpress.

Lo primero que haremos será escribir el encabezado para el plugin, ésto es lo que permitirá que Wordpress reconozca el plugin.

/* 
Plugin Name: Category 2 Post 
Plugin URI: http://nuevosprogramadores.com/category2post/ 
Description: Allows to include posts from one selected category 2 your post or page body. 
Version: 0.1 Author: Pablo Rodríguez Author URI: http://nuevosprogramadores.com 
*/ 
/*  Copyright 2008  Pablo Rodríguez  (email : prodriguez@nuevosprogramadores.com)      
This program is free software; you can redistribute it and/or modify     
it under the terms of the GNU General Public License as published by     
the Free Software Foundation; either version 2 of the License, or     
(at your option) any later version.      
This program is distributed in the hope that it will be useful,     
but WITHOUT ANY WARRANTY; without even the implied warranty of     
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     
GNU General Public License for more details.      
 
You should have received a copy of the GNU General Public License     
along with this program; if not, write to the Free Software     
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/

Como se puede apreciar, el encabezado está compuesto de 2 comentarios, sólo el primero es obligatorio, el segundo especifica que el plugin es publicado bajo licencia GPL.

Luego escribiremos la funcionalidad del plugin, en nuestro caso es una función que recorre los posts de una determinada categoría, arma un html con el contenido y por último reemplaza el comentario <!--category2post--> por el html con los posts que encontró anteriormente.

function category2post($c2p_content) { 
	$c2p_IDCategory = stripslashes(get_option('c2p_IDCategory')); 
	$c2p_NumberOfPosts = stripslashes(get_option('c2p_NumberOfPosts')); 
	$c2p_ShowAllContent = stripslashes(get_option('c2p_ShowAllContent')); 
	$c2p_result = ""; $c2p_posts = array(); 
 
	switch($c2p_NumberOfPosts) { 
		case 0: 
			c2p_posts = get_posts("category=$c2p_IDCategory"); 
			break; 
		default: 
			$c2p_posts = get_posts("numberposts=$c2p_NumberOfPosts&amp;category=$c2p_IDCategory"); 
			break; 
		} 
		if(sizeof($c2p_posts)) { 
			foreach($c2p_posts as $c2p_post) { 
			$c2p_result .= "<h3><a href="\">guid."\" id=\"".$c2p_post-&gt;ID."\"&gt;".$c2p_post-&gt;post_title."</a></h3>\n";
			if($c2p_ShowAllContent == '0') { 
				$c2p_result .= $c2p_post-&gt;post_excerpt."\n"; 
			} else { 
				$c2p_result .= $c2p_post-&gt;post_content."\n"; 
			} 
		} 
	} 
	return preg_replace('<!-- category2post -->|', $c2p_result, $c2p_content); 
}

Es muy importante buscar que los nombres de las funciones para no tener problemas con otros plugins y si las hubiese, hay que aplicar el mismo criterio con las variables. En mi caso utilicé el mismo prefijo para todo.

Como este plugin requiere de configuración, escribiremos también una función que agregue la página al panel de Wordpress.

function c2p_add_option_page() { 
	add_options_page('Opciones', 'Category2Post', 'manage_options', 'category2post/options-c2p.php'); 
}

Y por último haremos que todo esto funcione:

add_action('admin_head', 'c2p_add_option_page'); add_filter('the_content', 'category2post');

La primera línea asigna nuestra función c2p_add_option_page a la acción admin_head de Wordpress, mientras que la segunda indica que nuestra función category2post se debe ejecutar con el filtro the_content.

Por suerte Wordpress cuenta con una buena Referencia de Funciones, que nos sirve como guía para nuestras creaciones, además contamos con otros plugins que podemos utilizar como referencia para ver el código.

Hasta aquí las funciones que utilizamos son: get_option que nos permite obtener el valor de una opción desde la base de datos, get_posts para obtener los posts que cumplan con cierto criterio, en nuestro caso buscamos los que pertenezcan a una categoría y de ser necesario, que sólo devuelva x cantidad de posts, add_options_page para agregar nuestra página de opciones al panel de administración de Wordpress y por último add_action y add_filter.

}


Jul 26 2008

Plugin para Wordpress - Category2Post - v0.1 {

Después de mucho tiempo diciendo “algún día voy a hacer un plugin para Wordpress”, finalmente llegó el día, desde hoy se encuentra funcionando en Nuevos Programadores el plugin Category2Post que se encarga de recopilar las entradas publicadas bajo la categoría Mini Tips y mostrarlos en la página del mismo nombre.

El plugin está totalmente escrito en php y utiliza funciones de la muy documentada API de Wordpress para seleccionar los posts y mostrarlos. Si hay algún curioso que desee ver como funcionan los plugins de Wordpress, éste es bastante simple, lo suficiente como para entender la lógica para escribir un plugin e incluir una página para la configuración de opciones.

En un próximo post voy a explicar lo básico de la experiencia que fue escribir mi primer plugin para wordpress, mientras tanto si alguien lo prueba y encuentra algún bug o se le ocurre que se podría agregar una nueva funcionalidad, puede dejar un comentario o comunicarse conmigo a través del formulario de contacto del blog.

Descargar Category2Post

}


Jul 21 2008

Conectar a MySQL usando PHP {

Tag: MySQL, PHP

PHP es seguramente el lenguaje más usado para el desarrollo de aplicaciones web, y en la mayoría de las ocasiones es utilizado junto al motor de base de datos MySQL.

En este artículo crearemos una clase que se encargará de establecer una conexión con MySQL, insertar, modificar, eliminar y obtener registros.

A grandes rasgos, la clase se compone de un constructor, un destructor y los métodos que trabajan, en este caso, sobre una misma tabla. El ejemplo es muy simple, pero para empezar a trabajar con php y MySQL es suficiente.

Primero veamos la clase:


<?php
class socios_DAL {
	var $conn;
	var $db;
	var $ultimoComando;
 
	function __construct($dbName, $server, $user, $passwd) {
		if($dbName !== "" && $server !== "" && $user !== "" && $passwd !== "") {
			$this->conn = mysql_connect($server, $user, $passwd) or die("Error al intentar establecer la conexión.");
			if(isset($this->conn)) {
				$db = mysql_select_db($dbName, $this->conn) or die("Error al intentar seleccionar la base de datos.");
				$this->ultimoComando = array();
			}
		}
	}
 
	function __destruct() {
		if(isset($this->conn)) {
			mysql_close($this->conn);
		}
	}
 
	function obtenerUltimoComando() {
		return $this->ultimoComando;
	}
 
	function insertarSocio($num, $nombre, $apellido, $domicilio) {
		if($num !== "" && $nombre !== "" && $apellido !== "" & $domicilio !== "") {
			$sql = "INSERT INTO `tblSocios` (`num`, `nombre`, `apellido`, `domicilio`) VALUES ('$num', '$nombre', '$apellido', '$domicilio')";
			if(mysql_query($sql, $this->conn)) {
				$this->ultimoComando = array('comando' => $sql, 'resultado' => 'ok');
				return true;
			} else {
				if(mysql_errno() || mysql_error()) {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => "Error: ".mysql_errno().": ".mysql_error());
				} else {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => 'error');
				}
				return false;
			}
		}
	}
 
	function eliminarSocio($num) {
		if($num !== "") {
			$sql = "DELETE FROM `tblSocios` WHERE `num` = '$num' LIMIT 1";
			if(mysql_query($sql, $this->conn)) {
				$this->ultimoComando = array('comando' => $sql, 'resultado' => 'ok');
				return true;
			} else {
				if(mysql_errno() || mysql_error()) {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => "Error: ".mysql_errno().": ".mysql_error());
				} else {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => 'error');
				}
				return false;
			}
		}
	}
 
	function modificarSocio($num, $nombre, $apellido, $domicilio) {
		if($num !== "" && $nombre !== "" && $apellido !== "" & $domicilio !== "") {
			$sql = "UPDATE `tblSocios` SET `nombre` = '$nombre', `apellido` = '$apellido', `domicilio` = '$domicilio' WHERE `num` = '$num' LIMIT 1";
			if(mysql_query($sql, $this->conn)) {
				$this->ultimoComando = array('comando' => $sql, 'resultado' => 'ok');
				return true;
			} else {
				if(mysql_errno() || mysql_error()) {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => "Error: ".mysql_errno().": ".mysql_error());
				} else {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => 'error');
				}
				return false;
			}
		}
	}
 
	function obtenerSocios() {
		$resultado = array();
		$sql = "SELECT * FROM `tblSocios` ORDER BY `apellido`, `nombre`";
		if($socios = mysql_query($sql, $this->conn)) {
			$indice = 0;
			while($s = mysql_fetch_array($socios)) {
				$resultado[$indice] = $s;
				$idice++;
			}
			mysql_free_result($socios);
			$ultimoComando = array('comando' => $sql, 'resultado' => 'ok');
		} else {
			if(mysql_errno() || mysql_error()) {
				$this->ultimoComando = array('comando' => $sql, 'resultado' => "Error: ".mysql_errno().": ".mysql_error());
			} else {
				$this->ultimoComando = array('comando' => $sql, 'resultado' => 'error');
			}
		}
		return $resultado;
	}
 
	function obtenerSocio($num) {
		if($num !== "") {
			$sql = "SELECT * FROM `tblSocios` WHERE `num` = '$num' LIMIT 1";
			if($socio = mysql_query($sql, $this->conn)) {
				$ultimoComando = array('comando' => $sql, 'resultado' => 'ok');
 
				return mysql_fetch_array($socio);
			} else {
				if(mysql_errno() || mysql_error()) {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => "Error: ".mysql_errno().": ".mysql_error());
				} else {
					$this->ultimoComando = array('comando' => $sql, 'resultado' => 'error');
				}
				return null;
			}
		}
	}
}
?>

Como se puede ver en el código, la conexión se establece en el constructor de la clase y se mantiene el enlace en la variable $conn, la cual se utilizará cada vez que se realice una consulta. También en este método se selecciona la base de datos que utilizaremos, y se guarda el enlace, aunque no lo utilizaremos por el momento.

Se puede destacar la cláusula die() que se encarga de detener la ejecución del script, en este caso no nos interesa que se siga ejecutándo nuestro código si no pudimos establecer una conexión a la base de datos o no se obtuvo acceso a la base deseada.

Luego tenemos el destructor que se encarga solamente de cerrar la conexión, ésto se hace para liberar recursos en el servidor, lo cual puede llegar a ahorrarnos varios dolores de cabeza si la carga del servidor es muy grande.

Finalmente tenemos las funciones que trabajan sobre los datos, de éstas funciones voy a explicar un poco lo que hacen, ya que el código es muy simple y asumo que tenemos conocimientos por lo menos básicos de lenguaje SQL.

Las funciones que trabajan con los datos están escritas de forma muy similar, y la principal diferencia entre una y otra es la sentencia SQL que se utilizará. Hemos incluido un manejo precario de errores, que nos permitirá saber por qué no se ejecutó una determinada consulta.

Finalmente tenemos que probarla por lo que les recomiendo que descarguen el código fuente desde este enlace, en el archivo encontrarán la clase, un script para probar nuestra clase, y un script para la creación de la base de datos. Éste último fue generado con phpMyAdmin, para quienes no lo conocen, es un front -end para MySQL escrito en php.

Si alguien desea aportar algo o hacer alguna consulta no duden en dejar un comentario o enviar un mensaje usando el formulario de contacto.

Descargar el ejemplo de conexión a MySQL con PHP (2.05 KB)

}


Página 1 de 11