Entendiendo el Loop de WordPress
Una de las características más básicas (y poderosas) dentro de WordPress es The Loop, este pequeño fragmento de código que usamos una y otra vez. Y sin embargo, encuentro personas que se llaman a sí mismas expertas en WordPress y no saben qué es, eso es… triste.
Recientemente la empresa en la que trabajo compró otra empresa en el extranjero, y me pidieron que entrevistara a algunas personas para asegurarme de que saben un poco sobre WordPress, PHP, Frontend y demás. Mi primera entrevista fue bastante bien, hasta que pregunté “¿Cómo iniciamos The Loop en WordPress?”, la respuesta me sorprendió. No sabía ni siquiera qué era el loop.
El Loop es una característica bastante fácil de entender, así que decidí escribir un poco al respecto.
¿Qué es un loop?
Si eres programador, seguramente sabes qué es un loop, y si no… ¿En serio?
Cuando escribimos código, a veces necesitamos que un bloque de código se use más de una vez, podríamos simplemente escribir el mismo código una y otra vez, pero eso es solo una pérdida de tiempo, en esos casos usamos un loop, así que básicamente, un loop solo repite cosas. Por ejemplo, si queremos mostrar los números del uno al diez, podríamos hacer esto:
1echo "1n";2echo "2n";3echo "3n";4echo "4n";5echo "5n";6echo "6n";7echo "7n";8echo "8n";9echo "9n";10echo "10n";11
Para que sepas, yo escribí todo eso, y fue cansado… En lugar de eso, debería haber hecho esto:
1for ( $number = 1; $number <= 10; $number++ ) {2 echo $number . "n";3}4
Mucho más fácil.
Por cierto, usé un loop for
, hay varios tipos de loops. WordPress,
por ejemplo, usa un loop while
.
¿Qué es "El Loop”?
Ahora sabemos qué es un loop, pero ¿qué hace que el loop de WordPress sea tan especial que lo convierte en el loop? Bueno, sin The Loop, WordPress no nos mostraría lo que queremos ver, eso siendo nuestras publicaciones.
The Loop realiza un montón de acciones bajo el capó para que solo nos preocupemos de cómo mostrar nuestras publicaciones, y no de cómo recuperar nuestras publicaciones. Un loop muy básico (tomado de Twentythirteen) se ve así:
1<?php if ( have_posts() ) : ?>2 <?php /* El loop */ ?>3 <?php while ( have_posts() ) : the_post(); ?>4 <?php get_template_part( 'content', get_post_format() ); ?>5 <?php endwhile; ?>6 <?php twentythirteen_paging_nav(); ?>7<?php else : ?>8 <?php get_template_part( 'content', 'none' ); ?>9<?php endif; ?>10
Mantengamos en mente que cuando accedemos a cualquier página en WordPress, hay una consulta
global en marcha, eso significa que WordPress ya sabe qué página estamos visitando
y ya hay un objeto $wp_query
con toda la información que necesitamos, ahora veamos qué
hace el loop.
if ( have_posts() ):
Primero que nada, esta función verifica el objeto$wp_query
y devuelve verdadero si el objeto tiene publicaciones en él.while ( have_posts() ):
Ahora, este es el verdadero inicio del loop, mientrashave_posts()
sea verdadero, ejecutemos el resto del código dentro.the_post()
: Ahora que estamos dentro del loop, necesitamos poblar nuestro objeto$post
, esta función también disparasetup_postdata()
que verifica cosas como el número de páginas dentro de la publicación.get_template_part( 'content', get_post_format() )
: Ahora, tenemos nuestro objeto$post
completo, es hora de mostrarlo al mundo, podríamos simplemente insertar el marcado y funciones comothe_title()
ythe_content()
aquí mismo, pero es una buena práctica mantener las cosas limpias incluyendo una plantilla (planeo hablar sobreget_template_part
en otro post).endwhile
: Ya incluimos la plantilla para mostrar las publicaciones, así que podemos simplemente terminar el loop, recuerda, mientras haya publicaciones en la consulta, el loop estará en acción.twentythirteen_paging_nav()
: Esta función es específica de este tema, básicamente solo muestra enlaces de navegación en caso de que haya más publicaciones en la página.else
: Si la consulta estaba vacía, o sihave_posts
devolvió falso, entonces deberíamos hacerle saber al usuario incluyendo una plantilla especial para estas situaciones embarazosas.endif
: Termina completamente la declaración if, termina completamente el loop
Usando The Loop con queries personalizadas
Usualmente usamos The Loop junto con la consulta principal, o el objeto $wp_query
,
pero ¿qué pasa si por alguna razón necesitamos usar una queries personalizada?
Podríamos modificar la consulta usando query_posts
, pero no lo recomiendo porque
en realidad modifica la consulta principal, y usualmente trae más problemas que soluciones,
la solución real es simplemente crear una nueva consulta.
El método get_posts
La función get_posts
es una forma de crear pequeños loops personalizados, acepta
todos los parámetros de WP_Query
y devuelve un array con el resultado, de esa forma
podemos usar un loop foreach
para trabajar con las publicaciones:
1$posts = get_posts( $args );2foreach ( $posts as $post ) :3 setup_postdata( $post );4?>5 <h2><?php the_title(); ?></h2>6 <?php the_content(); ?>7<?php8endforeach;9wp_reset_postdata();10
Nótece cómo necesitamos ejecutar setup_postdata
manualmente? Eso es porque no
usamos the_post
en este loop.
El método de la “nueva query”
En mi experiencia personal, he tenido problemas al usar get_posts
en loops más
grandes, por eso en esos casos prefiero usar un nuevo WP_Query. Esto crea una nueva
consulta completamente independiente de la consulta principal, y podemos usar el loop
de WordPress sin preocupaciones.
1$my_query = new WP_Query( $args );2if ( $my_query->have_posts() ):3 while ( $my_query->have_posts() ) : $my_query->the_post();4?>5 <h2><?php the_title(); ?></h2>6 <?php the_content(); ?>7<?php8 endwhile;9 wp_reset_postdata();10endif;11?>12
Como puedes ver, es prácticamente el mismo loop que usamos con la consulta principal,
la diferencia es el uso constante de $my_query
, esto es necesario porque las funciones
have_posts
y the_post
son en realidad alias que apuntan al objeto $wp_query
, así que
cuando llamamos a have_posts
en realidad estamos llamando a $wp_query->have_posts
,
por eso necesitamos especificar que estamos llamando a la función en nuestro nuevo objeto $my_query
.
Fuera del loop
Cuando lees tutoriales y artículos sobre WordPress, a menudo ves las frases “dentro del loop” o “fuera del loop”, ¿qué significan?
Dentro del loop debe ser bastante obvio en este momento, todo entre el
while
y endwhile
, o foreach
y endforeach
está dentro del loop, eso significa
que usa ya sea la consulta principal, o una consulta personalizada, y que nuestro objeto $post
está disponible.
Fuera del loop, sin embargo, es todo lo que está fuera de esas etiquetas, no usa
ninguna consulta y el objeto $post
no está disponible. ¿Cómo podría ser útil?
Bueno, digamos que tienes una barra lateral personalizada en tus publicaciones, esta barra lateral debe mostrar un campo personalizado específico llamado “mood” que pertenece a la publicación actual. Pero la barra lateral está fuera del loop, ¿cómo puedo acceder a los datos de la publicación?
Antes, cuando dije que $post
no está disponible, quería decir que no está disponible
automáticamente, recuerda, cuando accedemos a cualquier página en WordPress, hay una
consulta principal en marcha, incluso si no tenemos un loop en la barra lateral, sí tenemos
un $wp_query
y un objeto $post
en algún lugar, solo necesitamos llamarlos.
1<?php2 global $post;3 $mood = get_post_meta( $post->ID, 'mood', true );4?>5<p>Me siento <?php echo $mood; ?></p>6
Como $post
es una variable global, eso significa que siempre está disponible para
nosotros, solo necesitamos saber cómo llamarlo, como a un viejo amigo.
Conclusión
Como puedes ver, El Loop es bastante fácil de entender, y increíblemente útil. Puedes estar seguro de que no importa en qué página de WordPress estés, siempre hay un loop en acción. Así que espero que este pequeño artículo te haya ayudado a entender un poco más sobre nuestro amigo The Loop.