wp_reset_postdata() o wp_reset_query() dopo un loop personalizzato?
Leggendo alcune informazioni su query_reset_postdata
e query_reset_query
mi sento confuso. Ad esempio:
Sopra si afferma che dovresti usare solo query_reset_postdata()
quando utilizzi "query separate".
Nell'esempio2 c'è un commento:
WP_Query( $args ) = wp_reset_postdata();
E
query_posts ( $args ) = wp_reset_query();
E in realtà non dovresti mai usare wp_reset_query
perché non dovresti usare query_posts!?
Nel Codex di WordPress si afferma che dovresti usare wp_reset_query()
dopo un loop personalizzato (primo esempio) http://codex.wordpress.org/Function_Reference/wp_reset_query
Allora il codex è sbagliato?

La differenza tra i due è che
wp_reset_query()
- assicura che la query principale sia stata ripristinata alla query principale originalewp_reset_postdata()
- assicura che il globale$post
sia stato ripristinato al post corrente nella query principale.
Infatti, guardando il sorgente vedrai che wp_reset_query()
chiama wp_reset_postdata()
. L'unica differenza tra i due è questa riga:
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
(in wp_reset_query()
). Quindi wp_reset_query()
è necessario solo se quei due global sono diversi, e ciò accade solo se è stato utilizzato query_posts()
da qualche parte.
Quando dovrei usarli?
In parole semplici:
wp_reset_postdata()
- subito dopo ogniWP_Query()
personalizzatowp_reset_query()
- subito dopo ogni loop che utilizzaquery_posts()
Dovrei usare wp_reset_query
Beh, sì, ma è necessario solo dopo aver usato query_posts()
. Come hai sottolineato tu, non dovresti mai usare query_posts()
. Quindi se non usi mai query_posts()
, allora non è necessario chiamare wp_reset_query()
(invece di wp_reset_postdata()
.
In breve, non è che non dovresti usare wp_reset_query()
invece di wp_reset_postdata()
, è che non dovresti mai averne bisogno!

Quindi in pratica stai dicendo: Usare solo wp_reset_postdata() e il codex ha un esempio poco chiaro? (Se vuoi farlo correttamente)

Il codex potrebbe cambiare, quindi eviterò di fare affermazioni assolute che potrebbero diventare non corrette. Contiene un esempio di loop WP_Query()
che utilizza wp_reset_query()
in modo non necessario. Potrebbe usare wp_reset_postdata()
invece, ma non fa male. Ha anche un esempio con query_posts()
dove usa, e deve usare, wp_reset_query()
. Come notato nel codex, tuttavia questo è un cattivo esempio e 'non raccomandato' nel senso che query_posts()
non dovrebbe mai essere usato.

Devo resettare la query se ciclo attraverso la query all'interno di un foreach loop?
Ad esempio:
$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()

Ho preso questo consiglio alla lettera e ho avuto problemi. Dice di chiamare wp_reset_postdata()
immediatamente dopo ogni WP_Query()
personalizzata (enfasi aggiunta). Ma, la documentazione per sviluppatori afferma che dovrebbe essere chiamato quando:
"Un loop di query secondario che utilizza $sec_query = new WP_Query() e $sec_query->the_post() influenza la variabile globale $post."
Ancora una volta, enfasi aggiunta.
Se non stai chiamando the_post()
allora non c'è bisogno di chiamare wp_reset_postdata()
e, infatti, farlo può causare problemi.
