Resetear o limpiar los loops de WordPress


Cuando trabajamos con WordPress y queremos hacer varias queries muchas veces es un quebradero de cabeza, porque los resultados que obtenemos no son los que deberían ser.

Para ello tenemos varias funciones y cada una de ella debe usarse en su lugar.

  • wp_reset_query() , se usa con WP_Query
  • wp_reset_postdata() , se usa con query_posts()

 

Cuando usar wp_reset_postdata()

Esta funcion se usa cuando utilizamos nuestras  WP_Query  dentro de una pagina o template y nos sirve para restaurar la   variable global $post del bucle principal.

Para que nos enteremos, cuando entramos en una pagina ya sea una entrada, pagina, categoría,  por defecto ya vienen cargados los datos de esa pagina ,.. y se encuentran en la variable global $post, nosotros al hacer otro bucle, perderemos la información principal asi que luego tenemos que restaurarla.

Por ejemplo si estamos creando una pagina de blog y hacemos una query donde queremos mostrar las entradas usaremos WP_Query() pero esta pagina ya tenia información como el titulo, contenido,… al usar wp_reset_postdata() restauramos la variable $post del bucle principal después de nuestro bucle.

<?php
// definimos $args para pasarlo a WP_QUERY
$args = array( 'posts_per_page' => 10 );

// nuestra query
$the_query = new WP_Query( $args );
?>

<?php if ( $the_query->have_posts() ) : ?>

	<!-- empezamos el bucle -->
	<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
		<?php the_title(); ?>
		<?php the_excerpt(); ?>
	<?php endwhile; ?><!-- end of the loop -->

	<!-- put pagination functions here -->
	<?php wp_reset_postdata(); ?>

<?php else:  ?>

<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>

<?php endif; ?

 

Cuando usar wp_reset_query()

Esta función la usaremos cuando trabajamos con query_posts y es parecida a la anterior

 

<?php

$args = array ( 'post_parent' => 5 );
query_posts( $args );

if ( have_posts() ):
    while ( have_posts() ) :
        the_post();

        // Do stuff with the post content.
        the_title();
        the_permalink(); // Etc.

    endwhile;
else:
    // Insert any content or load a template for no posts found.
endif;

wp_reset_query();

?>

 

Resumen

Ambas funciones resetean la query y restauran la variable global $post, pero wp_query_reset va un paso mas alla y actualiza y destruye la query anterio antes de hacerlo. Y saber que:

  • wp_query_reset()  se usa con query_post
  • wp_reset_postdata() , se usa con query_posts()

 

wp_reset_query() se llama fuera del if  y wp_reset_postdata() despues de terminar el while o la paginacion de este.