*

La consulta más sencilla puede colapsar un servidor WordPress

La consulta más sencilla en apariencia puede colapsar un servidor si tiene muchos usuarios. Un ejemplo, mostrar un listado principal de obras relacionadas a un artista, y en orden alfabético por su apellido.

La manera sencilla es realizar 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.

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.

Mejorando la consulta ejemplo:

$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 camposmeta_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).

id_obra meta_key id_artista apellidos
66 auto_value 100 Pradera
88 auto_value 200 Rocasolano
33 auto_value 10 Sanz

Listado de las obras ordenadas por los apellidos

Para ejecutarla:

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

Los resultados en plantilla con:

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