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.