Conservar el query o consulta original en bucles secundarios de WordPress

wordpress-logoCómo resolver el problema para conservar la consulta original en bucles secundarios de WordPress.

Sabemos que cada página de WordPress está asociada a una consulta a la bases de datos que nos permite mostrar la información en ella. Los resultados arrojados por la base son manejados a través de bucles que crearán la lista de posts.

Para el bucle principal sabemos que si queremos modificar su comportamiento debemos modificar la consulta original, para ello antes del bucle principal agregamos lo siguiente (marcado en negritas):

global $query_string;
query_posts( “$query_string&order=ASC” );

if ( have_posts() ) : while ( have_posts() ) : the_post();

En el código anterior estamos conservando la consulta original guardada en la cadena $query_string y le anexamos un comportamiento adicional concatenando otra cadena (“&order=ASC”). En este ejemplo estamos cambiando el comportamiento predeterminado haciendo que los posts aparezcan ahora de forma ascendente (los más viejos al inicio). Desde luego podemos hacer muchos más cambios. Para más referencia sobre consultas personalizadas revisen la ayuda de WordPress sobre la función query_posts.

Bien, ¿pero cómo se conserva la consulta original para bucles secundarios?

Hasta aquí no hay mayor problema porque la documentación de WordPress al respecto es extensa. El problema viene cuando queremos conservar la consulta anterior pero de bucles secundarios no del principal. Ahí es donde nosotros en Aportatips no encontrábamos la solución. Siempre usábamos métodos alternativos con tal de saltarnos el problema pero en realidad no lo estábamos resolviendo. Hasta que un día después de tanto ensayo dimos cómo era. Así que lo compartimos con ustedes esperando les sea de utilidad.

Sabemos que cuando modificamos el comportamiento de la consulta original es mejor no tocar la original y crear una nueva. Por ejemplo:

global $query_string;
$secundario = new WP_query();
if ( $secundario ->have_posts() ) : while ( $secundario->have_posts() ) :
$secundario->the_post();

Siguiendo el ejemplo anterior para conservar la consulta original y ordenarla descendentemente podríamos pensar que sería algo como:

global $query_string;
$secundario = new WP_query(“$query_string&order=ASC”);

Sin embargo, no funciona. Enseguida pensamos en otras alternativas como en el objeto $wp_query, así que lo usamos de las siguientes formas a ver con cual funciona:

global $wp_query;
$secundario = new WP_query(“$wp_query&order=ASC”);

No funciona porque de entrada estamos tratando de concatenar un objeto con una cadena. Así que probamos una propiedad del objeto para obtener la consulta asociada quedando de esta manera:

global $wp_query;
$secundario = new WP_query(“$wp_query->query&order=ASC”);

Esto está mucho mejor, pero desafortunadamente sigue sin funcionar. En este punto creemos que no hay forma de conservar la mugrosa consulta original en bucles secundarios (nótese la tensión provocada). Sin embargo, sí hay solución. Veamos cómo resultó luego de varios quebraderos de cabeza:

global $query_string;
$secundario = new WP_query();
$secundario->query(“$wp_query->query&order=ASC”);

Por fin funciona. Al parecer el constructor de la clase no toma como argumento la consulta cuando incluimos la original. Es por ello que enviamos la consulta luego de crear el objeto mediante su método query. Ya viendo la respuesta se ve simple. Hasta dudamos en Aportatips en publicarla por el trabajo que nos costó llegar a ella, pero bueno las cosas son para compartirse, tarde o temprano se recibe ayuda de otra forma. Esperemos les sea de utilidad. Saludos.

Escrito por: Antonio Ayora
http://www.aportatips.com/

Referencias

Esta entrada fue publicada en Computación, Internet, Programación y etiquetada , , , , , . Guarda el enlace permanente.

COMENTARIOS

Una Respuesta a Conservar el query o consulta original en bucles secundarios de WordPress

  1. Gustavo dijo:

    Muy bueno , gracias por el aporte!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *