Recientemente te he explicado qué es y cómo funciona el loop de WordPress, y también cómo modificar el loop para conseguir que se comporte de la manera en que tú quieras que lo haga, usando WP_Query
entre otros métodos para recuperar contenidos específicos de la base de datos.
Seguramente después de leer los anteriores artículos, te estarás preguntando cómo usar más de un Loop en WordPress y qué tienes que tener en cuenta para que no se rompa tu web. Está claro que el Loop se puede usar múltiples veces en tus temas y plugins. Como ya viste, esto facilita muchísimo el hecho de poder mostrar diferentes tipos de contenido en diferentes lugares de tu web en WordPress. Sin embargo, hemos de ser muy cuidadosos y seguir ciertas normas para evitar problemas.
En este último artículo sobre el loop de WordPress te voy a describir aspectos más avanzados sobre su uso. Veremos los loops anidados, cómo conseguir loops multipasada y cómo resetear loops y así mantener tu web sin errores.
De esta forma, una vez entiendas estos últimos conceptos algo más complejos, podrás considerarte todo un experto en WP_Query
y el loop de WordPress, y seguramente tendrás una mayor confianza al desarrollar tus propios temas o plugins, que es de lo que se trata. Sin más dilación, comencemos.
Loops Anidados
Los Loops anidados no son más que combinaciones de Loops unos dentro de otros. Se pueden crear dentro de un template de un tema usando, por ejemplo, el Loop principal junto a instancias adicionales de WP_Query
.
Como siempre es más fácil entender las cosas mediante un ejemplo, veamos cómo podemos crear un Loop anidado al Loop principal para mostrar entradas relacionadas con una entrada concreta basándonos en las etiquetas de dicha entrada. El código es este:
En el fragmento anterior tenemos el Loop principal que viene dado (líneas 2 y 3). Para cada entrada dentro de este loop mostramos la URL de la entrada y su título (ver the_permalink
y the_title
en la línea 6), así como el contenido (ver the_content
en la línea 8).
Además, obtenemos las etiquetas de la entrada con la función wp_get_post_terms
(la tienes en el Codex aquí) y las guardamos en la variable $tags
(ver línea 11). Si la entrada tenía etiquetas, cogemos los identificadores de las etiquetas y los guardamos en $tagIDs
(líneas 13 a 20).
Por último, vamos a crear un Loop anidado dónde buscar entradas que tengan las mismas etiquetas que la entrada principal. Estas serán las entradas relacionadas que mostraremos a continuación. Para ello, creamos una nueva instancia de WP_Query
(ver línea 30) y le pasamos el array de argumentos de la línea 24. Aquí (líneas 25 a 28) ponemos como condiciones que las entradas tengan las etiquetas cuyos identificadores están en $tagIDs
(tag__in
en línea 25) y que no sean la entrada principal (línea 26, para evitar repetir la entrada que ya hemos mostrado). Además, indicamos que queremos que el resultado se componga de un máximo de 5 entradas (condición en la línea 27).
Ejecutamos el loop anidado (línea 30) y si hay resultados (línea 31) iteramos por el bucle de entradas relacionadas y mostramos un enlace y el título de cada uno de estas entradas (línea 36). Obviamente, podemos incluir las etiquetas HTML y el CSS que queramos para maquetar el diseño como mejor nos guste, pero la estructura básica para entradas relacionadas usando loops anidados es la que has visto.
Loops Multipasada
Una técnica avanzada para reutilizar Loops es usar la función rewind_posts
(que tienes aquí descrita en el Codex). Esta función rebobina la consulta a la base de datos y el contador del loop, lo que nos permite hacer otro loop usando el mismo contenido que en el primer loop. Veamos un ejemplo dónde procesamos el Loop principal dos veces.
Hay que colocar la función rewind_posts
justo al final del primer bucle (ver línea 7), para que todo se rebobine y el segundo bucle pueda funcionar tal y como lo hizo el primero. Si no conoces el concepto de rebobinar, es que eres demasiado joven 😉

Nelio Content
Estoy tan contento con Nelio Content que parece que me hayan pagado para hablar bién de él… pero es que también a ti te encantará: funciona como prometen, la programación automática de mensajes es increíble, la calidad/precio no tiene parangón y su equipo de soporte se siente como si fueran parte del tuyo.

Panozk
Cómo Resetear Loops
Cuando modificamos el Loop principal o creamos loops personalizados, suele ser recomendable resetear el loop una vez hemos terminado. Esto lo podemos hacer de dos maneras distintas en WordPress: con wp_reset_postdata()
y con wp_reset_query()
.
El primer método es usar wp_reset_postdata()
. Esta función restaura la variable globaln $post
con el valor de la entrada actual en la consulta principal. Es el método preferido cuando usamos WP_Query
para crear loops personalizados.
Por ejemplo, supongamos que definimos un Loop personalizado como el siguiente:
Vemos que este loop modifica el Loop principal usando una nueva instancia deWP_Query
con condiciones específicas. Para evitar que otros loops en la misma página se vean afectados por este, utilizamos la llamada a la función wp_reset_postdata()
al final de este loop (ver línea 10). Esto restaura la variable $post
y elimina problemas con el objeto WP_Query
principal.
El segundo método disponible para evitar problemas al usar múltiples loops es utilizar la llamada wp_reset_query()
. Es el método preferido cuando usamos query_posts()
en nuestro loop personalizado.
En resumen, wp_reset_query()
va siempre después de usar query_posts
en el loop y wp_reset_postdata()
va siempre después de un loop que use WP_Query
o la función get_posts()
para recuperar datos. Si has tenido problemas alguna vez con múltiples loops, con estas dos funciones lo arreglas.
Repaso final
Y hasta aquí esta serie de artículos sobre el loop y WP_Query
en WordPress. Recordemos brevemente todo lo que hemos aprendido hasta ahora:
- En la primera entrada hemos estudiado:
- los pasos que sigue WordPress para generar el contenido de una página web,
- la estructura básica de un Loop en WordPress,
- el uso de Template Tags para mostrar contenido específico en un loop,
- y que el Loop es la conexión entre los datos que tenemos en la base de datos MySQL y el HTML que se renderiza en el navegador.
- En la segunda entrada vimos:
- cómo usar
WP_Query
para crear loops personalizados, - qué parametros podemos usar para modificar el loop,
- cómo usar
query_posts()
para modificar el loop de WordPress, - cómo usar
get_posts()
como alternativa a un loop para obtener contenidos, - y cómo usar el hook
pre_get_posts
para modificar todos los loops de WordPress.
- cómo usar
- En esta última entrada hemos visto:
- el uso de loops anidados para recuperar información compleja a partir de una entrada,
- cómo usar loops multipasada mediante el uso de la función de rebobinado de loops
rewind_posts()
, - cómo resetear loops con
wp_reset_query()
ywp_reset_postdata()
para evitar problemas entre loops.
Ya ves que ha sido bastante duro. Si quieres más información, está claro que has de ir al Codex. Te recomiendo que empieces estudiando más detalles sobre el objeto WP_Query. A partir de ahí podrás ir navegando y viendo todo lo que he ido explicando en esta serie.
Y si te quedan dudas, no te lo pienses y escríbenos. Déjanos un comentario con tu problema o con lo que quieras que expliquemos en más detalle e intentaremos ayudarte.
Imágen destacada de Randy Robertson
Deja una respuesta