wp_reset_postdata() sau wp_reset_query() după o buclă personalizată?

14 mai 2014, 09:35:18
Vizualizări: 92.1K
Voturi: 66

Citind câteva materiale despre query_reset_postdata și query_reset_query m-am confuzat. De exemplu:

  1. Este nevoie să folosești atât wp_reset_postdata cât și wp_reset_query împreună?

  2. http://www.poststat.us/properly-reset-wordpress-query/

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?

0
Toate răspunsurile la întrebare 1
4
106

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ă fiecare WP_Query() personalizată
  • wp_reset_query() - imediat după fiecare buclă care folosește query_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!

14 mai 2014 09:49:16
Comentarii

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

bestprogrammerintheworld bestprogrammerintheworld
14 mai 2014 10:40:07

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.

Stephen Harris Stephen Harris
14 mai 2014 11:08:23

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()

Marcuzio Developuzio Marcuzio Developuzio
9 nov. 2022 15:01:44

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.

Dave S Dave S
1 mai 2024 19:57:16