Uso avanzado del Loop de WordPress

Publicada en WordPress.

Mira nuestro v铆deo

Existe una versi贸n mejor de tu web

Comparte este art铆culo

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

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. Lee la entrada y sigue las indicaciones. Deber铆as ser capaz de replicar lo que se explica all铆. Sino lo consigues, busca un profesional que te lo pueda hacer.

  3. Buenas si quiero crear varios loops dentro de una misma pagina, puedo controlarlo con wp_query a traves de post per page?

    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 una respuesta

No publicaremos tu correo electr贸nico. 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.