Use get_the_terms() instead of wp_get_object_terms()

I was recently debugging the front page of a WordPress site and found a lot of queries to the terms and term relationships database tables. Digging a little deeper, I found that the culprit were a set of functions that were calling wp_get_object_terms() to get the terms from a set of looped posts… and then… Continue reading Use get_the_terms() instead of wp_get_object_terms()

Cómo agregar un nuevo panel a WordPress Debug Bar

Una de las ventajas del plugin WordPress Debug Bar es que puedes agregar nuevos paneles según tus propias necesidades; por ejemplo, para mostrar datos de respuestas desde APIs externas o conexiones con web services u otras funcionalidades que hayas implementado de forma particualr. Por supuesto, este es un ejemplo simplificado, pero es el punto de… Continue reading Cómo agregar un nuevo panel a WordPress Debug Bar

Recientemente rediseñamos el sitio de nuestra aplicación para la gestión de hoteles, y uno de los cambios más importantes fue poder ofrecer una mejor experiencia a los visitantes según su idioma. También nos interesaba tener una mejor interacción en los comentarios del blog, y para ello decidimos utilizar la plataforma de Disqus, que entre otras cosas, permite suscripciones por correo electrónico a los comentarios, identificación con cuentas de terceros, moderación por e-mail, etc.

Uno de los problemas que encontramos fue que Disqus tiene una configuración global para la cuenta, por lo que la opción que configuras en su panel aplica a todas las conversaciones en el sitio. Sin embargo, escudriñando el código del plugin para WordPress pude hallar un filtro que permite indicar explícitamente el idioma en que se debe cargar la sección de comentarios:

add_filter('disqus_language_filter', function( $lang ){
	// la función pll_current_language es del plugin polylang; y devuelve el idioma de la entrada actual
	$current_language = function_exists('pll_current_language') ? pll_current_language('locale') : 'es_ES';
	// ojo que en Disqus, inglés es "en" pero español "es_ES" :-P
	return $current_language == 'en_US' ? 'en' : $current_language;
});

Y si no estás usando WordPress, puedes indicar el idioma en la configuración del embebible.

Cómo asegurar las cookies de acceso a tu sitio WordPress

Recientemente se ha dado a conocer una vulnerabilidad en el sistema de autenticación de usuarios para los sitios con WordPress, que básicamente consiste en lo siguiente: La vulnerabilidad afecta tanto a sitios en WordPress.com como instalaciones propias. Al acceder a la administración de tu sitio, WordPress crea una cookie que le permite validarte como un… Continue reading Cómo asegurar las cookies de acceso a tu sitio WordPress

Puesto que Google Code ya está prácticamente muerto, transformé el antiguo repositorio de mi tema gratis para WordPress, Satorii, en un nuevo repositorio en GitHub. Y aprovechando este cambio, me puse a trabajar en algunos de los varios issues reportados, junto con definir algunos hitos para guiar su desarrollo futuro.

Actualmente, la meta fundamental es preparar el tema para poder ofrecerlo desde el repositorio de temas de WordPress, para lo cual sólo restan los detalles finales que han surgido tras un par de rondas de revisión.

Desde ya pueden bajar la versión más reciente, que soluciona varios problemas antiguos y moderniza considerablemente el funcionamiento del tema.

Una de las funciones más útiles de WordPress es get_post_meta( ), que nos permite obtener alguno de los metadatos asociados a una entrada.

Si deseamos obtener un metadato único, utilizamos get_post_meta( $post->ID, 'meta_key', true ), y si es múltiple, get_post_meta( $post->ID, 'meta_key', false), y aquí nos podemos topar un problema importante, ya que en algunas circunstancias el orden en que devuelve los resultados es aleatorio.

La razón de esto es que al ejecutar la función, WordPress carga la información de todos los metadatos asociados a la entrada en el caché de objetos, pero esta consulta no incluye un ORDER BY que permita determinar el orden, y aunque es posible especificar un orden predeterminado en una tabla, los datos de la tabla no permanecen en el mismo orden al actualizarla (por eso es que el orden es aleatorio)… esto es, si estás utilizando tablas MyISAM.

Sin embargo, existe un workaround para evitar este problema, ya que al utilizar tablas InnoDB, el orden en que se devuelven los resultados al hacer una consulta sin ORDER BY siempre es el mismo: de forma ascendente según su PRIMARY KEY.

O sea, si tienes este problema, te lo puedes ahorrar fácilmente con ALTER TABLE wp_postmeta ENGINE = InnoDB.

¡Ah! Por cierto, este problema ya está reportado como bug, y la solución (o sea, el ORDER BY) debiese venir incluído en WordPress 3.8; ¡yei!

Herramientas de localización para WordPress

Hace muchísimo tiempo escribí sobre la forma de preparar un archivo para localización con WordPress (o sea, permitir que un plugin o theme sea traducible). En ese post indicaba cómo utilizar dos de las funciones principales para marcar los textos para localización: _e() y __() Además de estas funciones, se han agregado algunas nuevas para… Continue reading Herramientas de localización para WordPress

Nuevo plugin para WordPress: 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… Continue reading Nuevo plugin para WordPress: Dashboard Posts Stats