En la entrada anterior hablaba sobre el loop o bucle de wordpress, en su esencia, de la forma más básica que nos lo encontramos.
El objetivo de esta segunda entrada es tratarlo con un poco más de profundidad y de una forma más avanzada.
La esencia del bucle de WordPress es la variable global $wp_query que es una instancia de la clase WP_Query, esta variable global es a la que se hace referencia en el bucle. Cuando se invoca el bucle la función get_posts() dentro del objeto genera la lista de resultados al visitar una URL (recordad que las condiciones se pasaban a través de la URL).
La clase WP_Query
Pues bien, la clase WP_Query la podemos instanciar cuando queramos, con esta clase podemos crear bucles personalizados donde nos plazca, indicando nosotros mismos las condiciones que queremos que se cumplan. En resumen, en lugar de usar la variable global $wp_query, somos nosotros los que instanciamos un objeto del mismo tipo.
[php]
$misPosts = new WP_Query( ‘post_type=post&author_name=juan’ );
while ( $mis_Posts->have_posts() ):
$mis_Posts->the_post();
//Accion
endwhile;
[/php]
Cuando instanciamos el objeto podemos pasarle una serie de condiciones, en este caso he cogido todos los tipos de entrada que sean posts y que hayan sido publicados por juan.
Si nos damos cuenta, ahora usamos los métodos have_posts() y the_post() del objeto que hemos instanciado, por defecto se llamaba a la de $wp_query.
Aquí podéis ver todos los parámetros que le podemos pasar en la consulta.
Las funciones query_posts() y get_posts()
Estas funciones son otros métodos de nivel inferior para personalizar bucles.
La peculiaridad del primero de ellos, la función query_posts(), es que actúa sobre la variable global $wp_query, es decir, si le pasamos una serie de condiciones sobreescribiremos el bucle por defecto.
Por ejemplo, si accedemos a la página de la etiqueta wordpress y antes del bucle por defecto incoproramos query_posts(), pasaría lo siguiente:
[php]
query_posts( ‘tag=facebook’ );
if ( have_posts() ):
while( have_posts() ):
the_post();
//Accion
endwhile;
endif;
[/php]
No se mostrarán las entradas con la etiqueta wordpress porque hemos sobreescrito el resultado por defecto por todas las entradas que tengan la etiqueta facebook, en este caso solo mostraría las que tienen facebook como etiqueta que puede tener también wordpress o no.
Para no cargarnos toda la consulta extraída desde la URL y modificarla podemos usar la variable global $query_string. Por ejemplo, si queremos cambiar el orden de aparición de los resultados y el año de las entradas a mostrar:
[php]
global $query_string;
query_posts( $query_string . ‘&orderby=title&order=ASC&year=2013’ );
if ( have_posts() ):
while( have_posts() ):
the_post();
//Accion
endwhile;
endif;
[/php]
Así hemos aprovechado ya las condiciones pasadas por la URL pero además hemos dicho que se ordenen por el título de forma ascendente y que solo sean entradas del 2013.
La última opción es la función get_posts(), aunque personalmente no me gusta pues no establece todos los datos que se utilizan con las etiquetas de plantilla y requiere la llamada a setup_postdata(). Otra peculiaridad es que devuelve una matriz y el resultado se ha de recorrer con foreach.
[php]
$misPosts = get_posts( ‘cat=3’ );
foreach ( $misPosts as $post ):
setup_postdata( $post );
the_title();
endforeach;
[/php]
Nos mostrará los títulos de los posts cuya categoria tenga la ID = 3.
Por último, como en casi todo en programación, todo lo que se empieza, se acaba, al igual que cuando abrimos ficheros luego los cerramos, o cuando reservamos memoria luego la liberamos, etc, cuando personalizamos un bucle, luego tenemos que reestablecerlo.
Para ello se usan las funciones wp_reset_postdata() y wp_reset_data(), la primera de ellas para cuando usamos WP_Query o get_posts() y la segunda para cuando usamos query_posts(), reestableciendo los datos del bucle nos ahorraremos quebraderos de cabeza cuando se combinen varios de ellos en una misma página.
Espero que os hayan servido las 2 últimas entradas en el blog. Cuesta imaginarse que hay tanto detrás de la presentación de los datos en WordPress cuando visitamos un blog, pero es interesante como funcionan las cosas detrás de lo que ve el usuario en sus pantallas.
¿Os imaginabais que hubiese tanto procesamiento por detrás cuando visitáis un blog?
1 comentario en «El bucle de WordPress (2/2)»