wp_reset_postdata() sau wp_reset_query() după o buclă personalizată?
Citind câteva materiale despre query_reset_postdata
și query_reset_query
m-am confuzat. De exemplu:
Mai sus se menționează că ar trebui să folosești doar query_reset_postdata()
când folosești "interogări separate".
În exemplul 2 există un comentariu:
WP_Query( $args ) = wp_reset_postdata(); // Inițializează WP_Query și resetează datele postului
ȘI
query_posts ( $args ) = wp_reset_query(); // Folosește query_posts și resetează interogarea
Și de fapt nu ar trebui să folosești niciodată wp_reset_query
pentru că nu ar trebui să folosești query_posts!?
În WP Codex se precizează că ar trebui să folosești wp_reset_query()
după o buclă personalizată (primul exemplu) http://codex.wordpress.org/Function_Reference/wp_reset_query
Codul din codex este greșit atunci?

Diferența dintre cele două este că
wp_reset_query()
- asigură că interogarea principală a fost resetată la interogarea principală originalăwp_reset_postdata()
- asigură că variabila globală$post
a fost restaurată la postul curent din interogarea principală.
Într-adevăr, dacă ne uităm la sursa vom vedea că wp_reset_query()
apelează wp_reset_postdata()
. Singura diferență dintre cele două este această linie:
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
(în wp_reset_query()
). Deci wp_reset_query()
este necesar doar dacă aceste două variabile globale diferă, iar asta se întâmplă doar dacă query_posts()
a fost folosită undeva.
Când ar trebui să le folosesc?
Pe scurt:
wp_reset_postdata()
- imediat după fiecareWP_Query()
personalizatăwp_reset_query()
- imediat după fiecare buclă care foloseștequery_posts()
Ar trebui să folosesc wp_reset_query?
Da, dar este necesară doar după utilizarea query_posts()
. După cum ai menționat, nu ar trebui să folosești niciodată query_posts()
. Deci, dacă nu folosești niciodată query_posts()
, atunci nu este necesar să apelezi wp_reset_query()
(în loc de wp_reset_postdata()
).
Pe scurt, nu este vorba despre faptul că nu ar trebui să folosești wp_reset_query()
în loc de wp_reset_postdata()
, ci despre faptul că nu ar trebui să ai nevoie niciodată de asta!

Deci practic spui: Folosește doar wp_reset_postdata() și codex-ul are un exemplu prost? (Dacă vrei să faci corect)

Codex-ul se poate schimba, așa că voi evita să fac afirmații absolute despre el care ar putea deveni incorecte. Are un exemplu de buclă WP_Query()
care folosește wp_reset_query()
și asta inutil. Ar putea folosi wp_reset_postdata()
în schimb, dar nu face niciun rău. Are și un exemplu cu query_posts()
unde folosește, și trebuie să folosească, wp_reset_query()
. După cum se menționează în codex, deși acesta este un exemplu prost și 'nu este recomandat' în sensul că query_posts()
nu ar trebui niciodată folosit.

Trebuie să resetez query-ul dacă parcurg rezultatele într-o buclă foreach?
De exemplu:
$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()

Am luat acest sfat literal și am avut probleme. Se spune să apelezi wp_reset_postdata()
imediat după fiecare interogare personalizată WP_Query()
(sublinierea este adăugată). Dar, referința pentru dezvoltatori spune că ar trebui apelată atunci când:
"O buclă secundară de interogare folosind $sec_query = new WP_Query() și $sec_query->the_post() afectează variabila globală $post."
Din nou, sublinierea este adăugată.
Dacă nu apelezi the_post()
, atunci nu este nevoie să apelezi wp_reset_postdata()
și, de fapt, a face acest lucru poate cauza probleme.
