Nuevo plugin para WordPress: Dashboard Posts Stats

1 comentarios

Dashboard Posts Stats

Hace algunos días, necesitaba crear una forma de visualizar la cantidad de entradas publicadas en un sitio. Después de algunas líneas de PHP y Javascript, tenía un pequeño widget para el escritorio de WordPress funcionando, y tras un par de vueltas más decidí compartirlo como plugin.

El resultado es Dashboard Posts Stats que te permite ver la actividad de publicación durante los últimos 30 días.

Por el momento es muy sencillo, pero ciertamente hay varias ideas y pendientes que pretendo aplicar para hacerlo cada vez más útil.

Se puede descargar desde el repositorio de plugins de WordPress, y si tienes alguna idea, solicitud o contribución, puedes enviarla a su repositorio en GitHub.

Usando decoradores para extender WP_Post

0 comentarios

La clase WP_Post recientemente introducida en WordPress 3.5 permite facilitar muchas tareas comunes en el desarrollo sobre este CMS, en particular el trabajo con campos personalizados almacenados en la tabla {$wpdb->prefix}postmeta.

Sin embargo, la forma en que está implementada esta clase aparentemente pone una limitante importante, ya que al estar definida como final no puede ser extendida mediante herencia:

class MiPost extends WP_Post{}
// Error Fatal: Class MiPost may not inherit from final class

Sin embargo, y aunque quizás no parezca obvio, es totalmente posible extender la funcionalidad de esta clase no utilizando herencia sino composición, por ejemplo, utilizando el patrón Decorator.

abstract class PostDecorator{
	
	/**
	 * Almacena el objeto post
	 * @access private
	 */
	private $post;
	
	/**
	 * @param object $post Un objeto de tipo WP_Post
	 */
	public function __construct( WP_Post $post ){
		$this->post = $post;
	}
}


class PostProyecto extends PostDecorator{
	
	/**
	 * @param string Nombre de la propiedad que se desea obtener
	 * @return string Valor de la propiedad
	 */
	public function __get( $key ){
		// permite acceso como $objeto->autor
		if ( $key === 'autor' )
			return $this->getAuthor();

		// si no corresponde a la funcionalidad que estamos agregando
		// podemos aprovechar el método __get() del objeto post
		return $this->post->{ $key };
	}

	/**
	 * @return string Nombre del autor o enlace
	 */
	public function getAuthor(){
		// el nombre del autor se almacena como un post meta con clave "_author"
		$author     = $this->post->_author;
		// la url está en un post meta con clave "_author_url"
		$author_url = $this->post->_author_url;
		return ( $author_url ) ? '<a href="'. esc_url($author_url) .'">'. $author .'</a>' : $author;
	}

}



$project_post = get_post(123);
$project = new PostProyecto( $project_post );

echo $project->autor;
// <a href="http://felipe.lv">Felipe</a>

De este modo, podríamos crear una clase para cada tipo personalizado de contenido, de modo de poder separar ordenadamente la lógica de la presentación y obtener una sintaxis muy clara y simple.

Objetos de posts de WordPress y la clase WP_Post

5 comentarios

Una de las novedades más interesantes para desarrolladores que trae WordPress 3.5 es que a partir de esta versión los objetos tipo “post” ya no son objetos estándares de PHP (stdClass) sino instancias de WP_Post.

Por supuesto, este cambio está asociado a algunas ventajas inmediatas, relacionadas con una mejor performance y una optimización en que estos objetos se pueden almacenar en la caché de objetos (sobre todo si estás usando una caché externa, como APC, XCache o memcached). Esto es en parte debido a la utilización de métodos mágicos, tales como __isset( $key ), y el que resulta mucho más interesante, __get( $key ), que por ejemplo, permite cargar los “ancestros” de una entrada sobre demanda (con “lazy loading”), pero además tiene la posiblidad de cargar cualquier campo personalizado con la misma técnica.

En la práctica, esto significa que la utilización de datos de postmeta es muchísimo más sencilla. Por ejemplo:

<?php

// WordPress pre-3.5
// Deseo mostrar el campo personalizado "_ubicacion"
$ubicacion = get_post_meta( $post->ID, '_ubicacion', true );
echo $ubicacion;

// WordPres 3.5+
echo $post->_ubicacion;

Es decir, puedes acceder cualquier postmeta simplemente indicando el correspondiente meta_key como propiedad del objeto $post… ¡más conveniente, imposible!

Y si como yo tienes una “sana preocupación” por la performance de esta funcionalidad, puedes estar tranquilo: desde hace varias versiones WordPress carga en caché toda la información de postmeta al acceder a cualquier campo personalizado, lo que significa que no estará realizando una consulta a la base de datos cada vez que debas acceder a una propiedad de postmeta.

El único “pero” de la implementación de la clase WP_Post es que está marcada en el core como una clase final, por lo que si deseas utilizarla en un contexto mayor, no podrás extender la clase mediante herencia (como en MiClase extends WP_Post), sino que deberás hacerlo mediante composición, un patrón de diseño que quizás es un poco menos obvio… pero eso es motivo para otro post.

Sanitizar consultas con cláusulas “IN” con $wpdb en WordPress

2 comentarios

Uno de los métodos que incluye la clase wpdb es prepare, que permite preparar una consulta a la base de datos para asegurarnos que se ejecute de forma segura.

Su utilización es bastante sencilla — y si hasta ahora no la estás utilizando deberías leer inmediatamente la sección sobre cómo proteger tus consultas ante ataques de inyección SQL — pero hasta hace poco no había ideado una forma sencilla de preparar consultas con cláusulas IN.

Una solución bastante sencilla que podemos aplicar es la siguiente:

// obtener un listado de IDs de entradas "especiales"
// $special_entries = array(1, 3, 5, 8, 13, [...]);
$special_entries = get_option('my_special_entries');

// ¿cuántas condiciones se van a seleccionar?
$how_many = count($special_entries);

// prepara la cantidad adecuada de reemplazos
// si se buscarán strings, el último parámetro sería '%s'
$placeholders = array_fill(0, $how_many, '%d');

// unir los reemplazos con comas
// $format = '%d, %d, %d, %d, %d, [...]'
$format = implode(', ', $placeholders);

// la consulta
$query = "SELECT ID, post_title, post_name, post_parent FROM $wpdb->posts WHERE post_parent IN($format)";

// obtener los resultados de forma segura
$results = $wpdb->get_results( $wpdb->prepare($query, $special_entries) );

Computer Modern Typewriter, una bella fuente para tu código

0 comentarios

Una buena fuente para tu código puede ser tan importante como elegir un buen editor.

Durante algún tiempo he deambulado entre diversas alternativas, como Inconsolata, Ubuntu Mono e incluso la reciente Source Code Pro de Adobe (todas ellas tienen licencias de código abierto y se pueden descargar desde los enlaces indicados).

Pero hoy encontré una nueva que es realmente una belleza: Computer Modern Typewriter.

La fuente es parte de una familia bastante amplia, que incluye variantes con y sin serifas en negritas e itálicas. Tiene soporte para Unicode y es una de las fuentes incluídas originalmente con TeX.

También tiene una licencia de código abierto, y se puede descargar desde su sitio web.

Actualización (28 octubre 2012): en Ubuntu (y supongo que también en otras distribuciones) está disponible Latin Modern, que puedes instalar desde repositorios con apt-get install lmodern.

Página 2 de 9912345102030Última »