È necessario utilizzare wp_reset_query () in una chiamata WP_Query?


26

Sto usando il seguente codice per recuperare 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">
        By <?php the_author() ?>
    </div>
    <div class="storycontent">
        <?php the_excerpt(); ?>
    </div>

<?php endwhile; ?>

Devo usare wp_reset_query()? Se lo faccio, dove devo posizionarlo?



2
Se fai affidamento sull'oggetto query principale da qualche altra parte nella pagina, quindi Sì! dovresti chiamarlo, per assicurarti che l'oggetto principale della query contenga che i dati siano stati eseguiti prima di iterare sulla tua query personalizzata. Quando chiami il the_post()metodo (es. $my_custom_query->the_post()) Riempi le variabili post che la query principale osserva, il reset riempie questi var con i dati precedenti quando lo chiami. È buona norma utilizzare i ripristini dopo query personalizzate.
t31os,

Risposte:


10

Ciao @janoChen:

Risposta semplice: no.

Ciò che segue è il codice PHP per la funzione wp_reset_query()da /wp-includes/query.phpWordPRess v3.0.4 e le funzioni successivamente chiamate. Puoi vedere che si tratta principalmente di modificare le variabili globali.

Quando lo utilizzerai new WP_Query($args), assegnerai il valore restituito dai valori a una variabile locale, quindi, a meno che tu non stia facendo qualcosa di così complesso che potresti già conoscere la risposta a questa domanda per allora no, non è necessario 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 - heh. Mi sta decisamente spingendo ultimamente, questo è certo! Immagino che, come si
suol

1
Solo per gli altri che leggono questo, poiché questa è ancora la risposta accettata (la risposta di @ Rarst dovrebbe essere accettata). Dal momento che l'OP utilizza the_post()nel suo codice, le migliori pratiche impongono che deve usare wp_reset_postdata(). wp_reset_query()chiama wp_reset_postdata(), quindi funzionerà, anche se l'altra cosa wp_reset_query()- reimpostare la $wp_queryvariabile globale - non è necessaria, ma in questo caso non è dannosa. Quindi la risposta è in realtà
Tom Auger,

21

Non è necessario WP_Queryda solo, ma è necessario (o almeno buona cosa da fare) se si utilizzano funzioni / metodi correlati (come the_post()o setup_postdata()) per riempire le variabili globali con i propri dati.

Fondamentalmente la creazione di un nuovo WP_Queryoggetto è semplicemente il recupero dei dati, ma usarlo per eseguire il ciclo attivo e rendere i dati accessibili ai tag del modello modifica l'ambiente ed è bene ripristinare tutto in seguito.

Nel complesso, non è significativo penalizzare le prestazioni chiamarlo, quindi è più facile chiamarlo piuttosto che decidere se dovresti o dimenticartene e avere qualcosa di misteriosamente rotto.

Aggiornare

wp_reset_postdata()la funzione sembra essere la scelta più adatta. wp_reset_query()ripristina le variabili globali $wp_query(quale WP_Queryoggetto personalizzato non influenza) e $post (che potrebbe come sopra) variabili. wp_reset_postdata()ripristina solo $post, che dovrebbe essere sufficiente.


2

No. Se crei un'istanza del tuo oggetto WP_Query, è tuo a che fare con quello che vuoi. Tuttavia, se manometti la global $wp_queryvariabile, beh, allora il tuo nello spazio dei nomi globale influisce sullo script di chiunque stia utilizzando contemporaneamente quella variabile. E se fai qualcosa per modificare i dati al suo interno, devi anche ripristinarlo dopo averlo usato.


0

Se si utilizza 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(); 

Quindi non incontrerai problemi. Altrimenti, se sulla stessa pagina c'è un altro loop, sei tenuto ad ottenere risultati inaspettati. Non ho usato wp_reset_query () nel codice sopra (che è stato inserito nel mio file header.php. Poi quando sono entrato in single.php per lo più ho le pagine di dettaglio di altre categorie che erano frustranti. Più tardi, mi sono reso conto che ho dimenticato di ripristinare la query in alto. Presto ha iniziato a funzionare come un incantesimo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.