È necessario utilizzare wp_reset_query() in una chiamata WP_Query?
Sto utilizzando il seguente codice per recuperare i post:
<?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">
Di <?php the_author() ?>
</div>
<div class="storycontent">
<?php the_excerpt(); ?>
</div>
<?php endwhile; ?>
Devo usare wp_reset_query()
? Se sì, dove dovrei posizionarlo?

Non è necessario per WP_Query
di per sé, ma è necessario (o almeno una buona pratica) se utilizzi qualsiasi funzione/metodo correlato (come the_post()
o setup_postdata()
) per riempire le variabili globali con i tuoi dati.
In sostanza, creare un nuovo oggetto WP_Query
è semplicemente un recupero di dati, ma usarlo per eseguire un loop attivo e rendere i dati accessibili ai tag del template modifica l'ambiente ed è buona norma ripristinare tutto successivamente.
In generale - non è un impatto significativo sulle prestazioni chiamarlo, quindi è più semplice chiamarlo sempre piuttosto che decidere se dovresti farlo o dimenticartene e ritrovarti con qualcosa che misteriosamente non funziona.
Aggiornamento
La funzione wp_reset_postdata()
sembra essere la scelta più appropriata. wp_reset_query()
ripristina la variabile globale $wp_query
(che un oggetto WP_Query
personalizzato non influenza) e $post
(che invece potrebbe influenzare come sopra). wp_reset_postdata()
ripristina solo $post
, il che dovrebbe essere sufficiente.

Ciao @janoChen:
Risposta semplice: no.
Quello che segue è il codice PHP della funzione wp_reset_query()
preso da /wp-includes/query.php
in WordPress v3.0.4 insieme alle funzioni chiamate successivamente. Puoi vedere che si tratta principalmente di modificare variabili globali.
Quando usi new WP_Query($args)
assegnerai il valore di ritorno a una variabile locale, quindi a meno che tu non stia facendo qualcosa di così complesso da conoscere già la risposta a questa domanda, allora no, non devi chiamare 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 - eh eh. Ultimamente mi sta decisamente spingendo al limite, questo è certo! Immagino che, come si suol dire, la competizione migliori la razza (ma di certo mi impedisce di portare a termine qualsiasi altra cosa produttiva! '-)

Solo per gli altri che leggono, dato che questa è ancora la risposta accettata (la risposta di @Rarst dovrebbe essere quella accettata). Dal momento che l'OP usa the_post()
nel suo codice, le best practice indicano che deve usare wp_reset_postdata()
. wp_reset_query()
chiama wp_reset_postdata()
, quindi funzionerà, anche se l'altra cosa che fa wp_reset_query()
- resettare la variabile globale $wp_query
- non è necessaria, ma non è dannosa in questo caso. Quindi la risposta è in realtà SÌ

No. Se istanzi il tuo oggetto WP_Query personale, è tuo e puoi farci ciò che vuoi. Tuttavia, se modifichi la variabile global $wp_query
, allora sei nello spazio dei nomi globale e influenzerai qualsiasi script che sta utilizzando contemporaneamente quella variabile. E se fai qualcosa per cambiare i dati al suo interno, devi anche ripristinarla dopo aver finito di usarla.

Se stai utilizzando una query personalizzata come questa
$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();
Allora non incorrerai in problemi. Altrimenti, se nella stessa pagina c'è un altro loop, è probabile che otterrai risultati inaspettati. Non ho utilizzato wp_reset_query() nel codice sopra (che era posizionato nel mio file header.php). Poi, quando accedevo a single.php, ottenevo principalmente le pagine di dettaglio di altre categorie, il che era frustrante. Successivamente, mi sono reso conto di aver dimenticato di resettare la query in cima. Poco dopo, ha iniziato a funzionare perfettamente.
