Este necesar să folosești wp_reset_query() într-un apel WP_Query?
Folosesc următorul cod pentru a prelua postări:
<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');
while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>
<h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<div class="meta">
De <?php the_author() ?>
</div>
<div class="storycontent">
<?php the_excerpt(); ?>
</div>
<?php endwhile; ?>
Trebuie să folosesc wp_reset_query()
? Dacă da, unde ar trebui să-l pun?

Nu este necesar pentru WP_Query
în sine, dar este necesar (sau cel puțin recomandat) dacă folosești orice funcții/metode conexe (cum ar fi the_post()
sau setup_postdata()
) pentru a umple variabilele globale cu datele tale.
În esență, crearea unui nou obiect WP_Query
reprezintă doar preluarea de date, dar utilizarea acestuia pentru a rula un loop activ și pentru a face datele accesibile tag-urilor de șablon modifică mediul și este bine să resetezi totul după aceea.
În general - nu există un impact semnificativ asupra performanței pentru a-l apela, așa că este mai ușor să-l apelezi întotdeauna decât să decizi dacă ar trebui sau să uiți și să ai ceva care se strică misterios.
Actualizare
Funcția wp_reset_postdata()
pare să fie alegerea mai potrivită. wp_reset_query()
resetează variabila globală $wp_query
(pe care un obiect WP_Query
personalizat nu o afectează) și $post
(pe care s-ar putea să o afecteze, conform celor de mai sus). wp_reset_postdata()
restabilește doar $post
, ceea ce ar trebui să fie suficient.

Salut @janoChen:
Răspuns simplu: nu.
Urmează codul PHP pentru funcția wp_reset_query()
din /wp-includes/query.php
în WordPress v3.0.4, precum și funcțiile apelate ulterior. Puteți observa că în principal se referă la modificarea variabilelor globale.
Când folosești new WP_Query($args)
, vei atribui valoarea returnată unei variabile locale, așa că, dacă nu faci ceva atât de complex încât deja ai ști răspunsul la această întrebare, atunci nu, nu trebuie să apelezi wp_reset_query()
:
function wp_reset_query() {
unset($GLOBALS['wp_query']);
$GLOBALS['wp_query'] =& $GLOBALS['wp_the_query'];
wp_reset_postdata();
}
function wp_reset_postdata() {
global $wp_query;
if ( !empty($wp_query->post) ) {
$GLOBALS['post'] = $wp_query->post;
setup_postdata($wp_query->post);
}
}
function setup_postdata($post) {
global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;
$id = (int) $post->ID;
$authordata = get_userdata($post->post_author);
$day = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
$numpages = 1;
$page = get_query_var('page');
if ( !$page )
$page = 1;
if ( is_single() || is_page() || is_feed() )
$more = 1;
$content = $post->post_content;
if ( strpos( $content, '<!--nextpage-->' ) ) {
if ( $page > 1 )
$more = 1;
$multipage = 1;
$content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content);
$content = str_replace("\n<!--nextpage-->", '<!--nextpage-->', $content);
$content = str_replace("<!--nextpage-->\n", '<!--nextpage-->', $content);
$pages = explode('<!--nextpage-->', $content);
$numpages = count($pages);
} else {
$pages = array( $post->post_content );
$multipage = 0;
}
do_action_ref_array('the_post', array(&$post));
return true;
}
-Mike

@janoChen - heh. Cu siguranță m-a împins în ultima vreme, asta e clar! Cred că așa cum se spune, competiția îmbunătățește rasa (dar cu siguranță mă împiedică să mai fac altceva productiv! '-)

Doar pentru alții care citesc asta, deoarece acesta este încă răspunsul acceptat (răspunsul lui @Rarst ar trebui să fie acceptat). Deoarece OP folosește the_post()
în codul său, cele mai bune practici dictează că trebuie să folosească wp_reset_postdata()
. wp_reset_query()
apelează wp_reset_postdata()
, deci va funcționa, deși celălalt lucru pe care îl face wp_reset_query()
- resetarea variabilei globale $wp_query
- nu este necesar, dar nu este dăunător în acest caz. Deci răspunsul este de fapt DA

Nu. Dacă instanțiezi propriul obiect WP_Query, acesta este al tău și poți face cu el ce dorești. Totuși, dacă modifici variabila global $wp_query
, atunci te afli în spațiul global, afectând orice script care utilizează în același timp acea variabilă. Și dacă faci ceva pentru a schimba datele din ea, trebuie să o resetezi și după ce ai terminat de utilizat-o.

Dacă folosești o interogare personalizată ca aceasta
$cat = new WP_query();
$cat->query("cat=19,20,-23&showposts=5&orderby=rand");
while ($cat->have_posts()) : $cat->the_post();
$data = get_post_meta( $post->ID, 'key', true );
$img_arrays []= $data['productimage'];
$lnk_arrays[] =get_permalink($post_ID);
endwhile;
wp_reset_query();
Atunci nu vei întâmpina probleme. În caz contrar, dacă pe aceeași pagină există o altă buclă, vei obține rezultate neașteptate. Nu am folosit wp_reset_query() în codul de mai sus (care era plasat în fișierul meu header.php). Apoi, când am ajuns în single.php, în majoritatea cazurilor primeam pagini de detaliu din alte categorii, ceea ce era frustrant. Mai târziu, am realizat că am uitat să resetez interogarea la început. În scurt timp, totul a început să funcționeze perfect.
