Uso avanzado del Loop de WordPress

WordPress

Ojalá tuviera un calendario donde poder planificar todas mis entradas… espera un momento, ¡si ya lo tengo! ¡Si es que incluso me ayuda a promocionarlas en las redes sociales! ¡Descúbrelo!

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 😉

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.
  • 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() y wp_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

FlojaNo está malBienMuy bien¡Impecable! (1 votos, promedio: 5,00 de 5)
Cargando…

por

Doctor en Computación por la UPC, con publicaciones en el campo de la minería de datos y de la explotación de información relevante de grandes volúmenes de datos en el campo de la salud. Especializado en el diseño, desarrollo e integración de servicios y aplicaciones web en el cloud. Contribuye muy activamente en la comunidad WordPress participando en meetups, seminarios y WordCamps.

6 comentarios en “Uso avanzado del Loop de WordPress

  1. De qué forma se debe modificar el ejemplo de loop anidado de tags por categorías, ya modifique el parametro tag_in por category_in pero sigue manejando la lógica de las etiquetas, alguna pista.

    Saludos.

    1. Francisco, lo que debes hacer es cambiar la llamada wp_get_post_terms( get_the_ID() ); por wp_get_post_terms( get_the_ID(), 'category' );

      Con esto te debería funcionar y coger las categorías. Tienes más información sobre la función wp_get_post_terms aquí.

  2. Hola. necesito crear varios loops en varias paginas. en el index.php un loop que muestre todas las categorias y en las otras paginas un loop que muestra la categoria de cada pagina pero no lo consigo

    1. ¡Hola! Para crear varios loops tienes que hacer varias consultas con WP_Query. Ten en cuenta que posts_per_page es un condicionante de WP_Query, pero para controlar las diferentes consultas tendrás que resetearlas adecuadamente.

Deja un comentario

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

He leído y acepto la Política de privacidad de Nelio Software.

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.