Consultas especiales en WordPress

Por Ernesto Jiménez · 2 octubre, 2012
Publicado en Tutoriales

Perdonen ustedes que hoy me ponga un poco técnico, quizá en exceso, pero me gustaría compartir aquí algunas consultas curiosas que he tenido que hacer últimamente en WordPress. Parece que con los objetos y funciones de búsqueda que el motor de contenidos trae de serie tenemos suficiente y, bueno, en la mayoría de los casos es así, pero la experiencia me ha enseñado que, en el momento en que creamos un sitio con WordPress desde cero, y si tiene cierta complejidad, lo más probable es que tengamos que construir nuestras propias consultas tarde o temprano. Y aquí es donde el juego se hace más divertido.

 

A poco que tengamos varias relaciones entre posts y campos personalizados, necesitaremos diseñar consultas más o menos complejasEstos días he estado construyendo un sitio web en el que había una serie de obras de arte por un lado y un listado de artistas por otro. Cada obra estaba vinculada a un artista y un artista podía tener varias obras asociadas. Aunque en el sitio sólo se navega por obras, ambos elementos debían tener entidad propia. Además cada grupo de elementos tenía sus propios datos asociados: título, ficha técnica, año, nombre, apellidos, datos de contacto…

 

Detalle de la tabla post_meta, mostrando los datos nombre y apellidos

En el tema que hice, creé dos tipos de posts personalizados: «artistas» y «obras». A los posts de artistas añadí unos cuantos campos personalizados (nombre, apellidos, datos de contacto…). Lo mismo a las obras (ficha técnica, descripción…). Para relacionar las obras con los artistas puse una cajita con un desplegable que mostraba los nombres de los artistas y los vinculada a través del campo ID de la tabla de posts.  De esta manera ya tenía la estructura, en la administración y en la base de datos, necesaria para crear los contenidos.

Detalle de la tabla de posts de WordPress, mostrando algunos campos del tipo de post personalizado

 

La consulta más sencilla en apariencia puede colapsar un servidor si tiene muchos usuarios El mayor obstáculo lo encontré cuando tuve que hacer la página que mostraba las obras. Queríamos que el listado principal mostrara las obras por orden alfabético de apellido del autor. La manera fácil era hacer primero una consulta en la tabla de posts de tipo «artistas», uniendo la tabla «post_meta» a través de la ID de post y ordenarlo por el campo personalizado «apellidos». En el bucle de autores, teniendo la id de cada autor, podríamos consultar de nuevo la tabla de «posts», esta vez solicitando los de tipo «obras» y ya ordenarlos por «título». Pero esta solución con una primera consulta y luego una consulta por cada autor es cualquier cosa menos óptima. Trabajar durante años en el desarrollo de la aplicación web de Caja Granada me exigió trabajar una y otra vez cada consulta a las bases de datos para optimizarlas lo más posible. Hasta la consulta más sencilla en apariencia puede colapsar un servidor con la cantidad adecuada de usuarios conectados y un número curioso de registros.

 

Así que me puse a hacerlo todo en una consulta:

$consulta = “SELECT wp_posts.*, meta_key, meta_value as id_autor, (SELECT meta_value FROM wp_postmeta WHERE post_id=id_autor AND meta_key='apellidos_meta_value') AS apellidos_autor FROM `wp_posts` JOIN (wp_postmeta) ON wp_posts.ID= wp_postmeta.post_id WHERE post_type=‘obras’ AND post_status='publish' AND meta_key='autor_value' ORDER BY apellidos_autor ASC";

Lo que esa consulta le dice a la base de datos es: dame todos los campos de la tabla de posts que sean del tipo obras (y que estén publicados) y los vamos a unir por las ids con los campos meta_key y meta_value de la tabla wp_postmeta de manera que, en cada registro, tengamos todos los datos de la obra más el nombre completo del autor. Además en la misma consulta, pedimos el valor de los apellidos de la tabla de campos personalizados relacionando el id del post del artista con el valor de autor del post de la obra, le asignamos la etiqueta «apellidos», lo unimos a los registros que obtenemos y pedimos que el resultado venga ordenado por este valor. Voilà! En una consulta hemos sacado el listado de obras que queríamos ordenadas por un valor personalizado (los apellidos) de una serie de elementos vinculados (los artistas).

Tenemos las obras ordenadas por los apellidos de los artistas

Ya sólo quedaría ejecutarla:

$resultados = $wpdb->get_results($consulta);

y darle formato a los resultados para usar las etiquetas de plantilla con:

foreach($result as $post):setup_postdata($post);

 

Bien mirada, la consulta no es para nada compleja, pero sí me parece interesante. Hemos consultado posts de diferentes tipos vinculados entre sí y trabajado con información contenida en la tabla wp_postmeta. Además me apetecía compartir otro ejemplo más de lo potente que es WordPress (y cómo podemos hacer lo que queramos con él gracias a un poquito de PHP y MySql ;-)). Y, una vez más, perdonen que me haya puesto un poco técnico.

Entradas relacionadas

Cómo crear un tema de WordPress desde cero.
Introducción a los temas (videotutorial) 

¿Te ha gustado el post? Puedes seguirme en Twitter o en Facebook donde seguimos hablando de estrategia de contenidos y marketing digital