È necessario utilizzare wp_reset_query() in una chiamata WP_Query?

29 gen 2011, 08:52:50
Visualizzazioni: 17.1K
Voti: 28

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?

2
Commenti

Correlato: Quando dovresti usare WP_Query vs query_posts() vs get_posts()?

Jan Fabry Jan Fabry
29 gen 2011 11:40:30

Se stai utilizzando l'oggetto query principale da qualche altra parte nella pagina, allora Sì! dovresti chiamarlo, per assicurarti che l'oggetto query principale contenga i dati che aveva prima di iterare sulla tua query personalizzata. Quando chiami il metodo the_post() (cioè $my_custom_query->the_post()) riempi nuovamente le variabili dei post che la query principale controlla, il reset ripristina queste variabili con i dati precedenti quando lo chiami. È buona pratica utilizzare i reset dopo le query personalizzate.

t31os t31os
29 gen 2011 14:32:02
Tutte le risposte alla domanda 4
0
22

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.

29 gen 2011 15:50:33
2
10

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

29 gen 2011 08:55:16
Commenti

@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! '-)

MikeSchinkel MikeSchinkel
29 gen 2011 09:20:17

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à

Tom Auger Tom Auger
22 lug 2013 22:22:21
0

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.

13 lug 2013 19:54:07
0

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.

16 giu 2011 13:19:13