El bucle (IV) Personalizando el bucle (II) query_posts()
Aunque el objeto WP_Query es la forma más común de personalizar bucles, existen otros métodos como query_posts() que se suele utilizar para modificar el contenido devuelto por el bucle predeterminado. En concreto puede modificar el contenido recibido por $wp_query una vez realizada la consulta.
El problema de esta opción es que se descartan los resultados previamente almacenados en la caché de la consulta por lo que se puede ver afectado el rendimiento de la base de datos.
Esta función siempre debe ubicarse justo por encima del bucle:
<?php query_posts( argumentos ); if(have_posts()): while (have_posts()) : the_post(); //las etiquetas de plantilla que deseemos endwhile; endif; ?>
La invocación de query_posts() sobrescribe el contenido original extraído para el bucle.
Para evitar perder el contenido que se encuentra en el bucle primigenio, se pueden guardar los datos en la variable global $query_string
<?php global $query_string; //esto inicializa la variable global query_posts($query_string . "&orderby=title&order=DESC"); if(have_posts()): while (have_posts()) : the_post(); the_title(); echo '<br>'; endwhile; endif; ?>
En este ejemplo vemos como se inicializa la variable $query_string y como se utiliza luego para consulta original ordenando los resultados por orden de nombre de forma alfabética.
Incluso se pueden declarar los argumentos como en un array:
$args = array ( 'cat' => 1, 'orderby' => 'title', );
Esta función no pretende crear bucles, sino realizar pequeños cambios en la consulta personalizada, o incluso la predeterminada pero tiene algunas desventajas, como los gremmlins…:
- Solo debe de invocarse una vez y nunca dentro del propio bucle, ya que al hacer esto puede ocurrir que el bucle comience a mostrar resultados inesperados.
- Anula al objeto global $wp_query y esto puede provocar que desaparezcan funciones condicionales como is_home(), mientras WP_Query establece correctamente todas las etiquetas.
- Ejecuta una nueva consulta a la base de datos por lo que elimina la caché de la primera, además de poder ralentizar el funcionamiento de la web por hacer diferentes consultas.