¿Usar wp_reset_postdata() o wp_reset_query() después de un loop personalizado?
Al leer sobre query_reset_postdata
y query_reset_query
me siento confundido. Por ejemplo:
Lo anterior indica que solo deberías usar query_reset_postdata()
cuando usas "consultas separadas".
En el ejemplo2 hay un comentario:
WP_Query( $args ) = wp_reset_postdata();
Y
query_posts ( $args ) = wp_reset_query();
¡Y realmente nunca deberías usar wp_reset_query
porque no deberías usar query_posts!?
En el Codex de WP dice que deberías usar wp_reset_query()
después de un loop personalizado (primer ejemplo) http://codex.wordpress.org/Function_Reference/wp_reset_query
¿Entonces el codex está equivocado?

La diferencia entre los dos es que
wp_reset_query()
- asegura que la consulta principal se ha restablecido a la consulta principal originalwp_reset_postdata()
- asegura que el global$post
se ha restaurado al post actual en la consulta principal.
De hecho, al mirar el código fuente verás que wp_reset_query()
llama a wp_reset_postdata()
. La única diferencia entre los dos entonces es esta línea:
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
(en wp_reset_query()
). Así que wp_reset_query()
solo es necesario si esos dos globales difieren, y eso solo ocurre si se ha usado query_posts()
en algún lugar.
¿Cuándo debería usarlos?
En pocas palabras:
wp_reset_postdata()
- inmediatamente después de cadaWP_Query()
personalizadowp_reset_query()
- inmediatamente después de cada bucle que usequery_posts()
¿Debería usar wp_reset_query?
Bueno, sí, pero solo es necesario después de usar query_posts()
. Como has señalado, nunca deberías usar query_posts()
. Así que si nunca usas query_posts()
, entonces no es necesario llamar a wp_reset_query()
(en lugar de wp_reset_postdata()
).
En resumen, no es que no debas usar wp_reset_query()
en lugar de wp_reset_postdata()
, ¡es que nunca deberías necesitarlo!

Entonces básicamente estás diciendo: ¿Solo usar wp_reset_postdata() y el codex tiene un mal ejemplo? (Si quieres hacerlo correctamente)

El codex puede cambiar, así que voy a evitar hacer declaraciones absolutas sobre él que podrían volverse incorrectas. Tiene un ejemplo de un bucle WP_Query()
que usa wp_reset_query()
innecesariamente. Podría usar wp_reset_postdata()
en su lugar, pero no hace daño. También tiene un ejemplo de query_posts()
donde sí usa, y debe usar, wp_reset_query()
. Como se señala en el codex, aunque este es un mal ejemplo y 'no recomendado' en el sentido de que query_posts()
nunca debería usarse.

¿Necesito restablecer la consulta si recorro la consulta dentro de un bucle foreach?
Por ejemplo:
$sol_args = array( 'post_type' => 'solution', 'orderby' => 'menu_order', 'order' => 'ASC', 'lang' => pll_current_language(), 'posts_per_page' => '-1', );
$solution_posts = new WP_Query($sol_args); $solution_posts = $solution_posts->get_posts();
<?php foreach ($solution_posts as $solution_post) { ?> <?php } ?>
wp_reset_postdata()

Tomé este consejo literalmente y tuve problemas. Dice que hay que llamar a wp_reset_postdata()
inmediatamente después de cada consulta personalizada WP_Query()
(énfasis añadido). Pero, la referencia para desarrolladores dice que debería llamarse cuando:
"Un bucle de consulta secundario usando $sec_query = new WP_Query() y $sec_query->the_post() afecta a la variable global $post."
De nuevo, énfasis añadido.
Si no estás llamando a the_post()
entonces no hay necesidad de llamar a wp_reset_postdata()
y, de hecho, hacerlo puede causar problemas.
