Est-il nécessaire d'utiliser wp_reset_query () dans un appel WP_Query?

25

J'utilise le code suivant pour récupérer les messages:

<?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; ?>

Dois-je utiliser wp_reset_query() ? Si je le fais, où devrais-je le placer?

    
posée janoChen 29.01.2011 - 07:52
la source

4 réponses

10

Bonjour @janoChen:

Réponse simple: n °

Ce qui suit est ce que le code PHP de la fonction wp_reset_query() de /wp-includes/query.php dans WordPRess v3.0.4 ainsi que les fonctions appelées ultérieurement. Vous pouvez voir qu'il s'agit principalement de modifier des variables globales.

Lorsque vous utiliserez new WP_Query($args) , vous affecterez la valeur renvoyée des valeurs à une variable locale. Par conséquent, à moins que vous ne fassiez quelque chose de si complexe que vous connaissiez déjà la réponse à cette question, vous ne le ferez pas besoin d'appeler 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

    
réponse donnée MikeSchinkel 29.01.2011 - 07:55
la source
20

Cela n'est pas nécessaire pour WP_Query en tant que tel, , mais il est nécessaire (ou du moins il est bien de le faire) si vous utilisez des fonctions / méthodes associées (telles que the_post() ousetup_postdata()) pour remplir les variables globales avec vos données.

Fondamentalement, créer un nouvel objet WP_Query consiste simplement à récupérer des données, mais son utilisation pour exécuter une boucle active et rendre les données accessibles aux balises de modèle modifie l'environnement et il est bon de tout réinitialiser par la suite.

Dans l’ensemble, ce n’est pas une pénalité de performance significative de l’appeler, il est donc plus facile de toujours l’appeler que de décider si vous devriez ou de l’oublier et de faire quelque chose de mystérieusement cassé.

Mettre à jour

La

fonction wp_reset_postdata() semble plus appropriée choix. wp_reset_query() réinitialise les variables globales $wp_query (que l'objet personnalisé WP_Query n'affecte pas) et $post (ce qui pourrait être le cas ci-dessus). wp_reset_postdata() ne restitue que $post , ce qui devrait suffire.

    
réponse donnée Rarst 29.01.2011 - 14:50
la source
2

Non. Si vous instanciez votre propre objet WP_Query, vous pouvez le faire avec ce que vous voulez. Cependant, si vous manipulez la variable global $wp_query , eh bien, votre espace de nom global affecte le script de quiconque utilise simultanément cette variable. Et si vous faites quelque chose pour changer les données qu'il contient, vous devez également le réinitialiser après l'avoir utilisé.

    
réponse donnée RebelPhoenix 13.07.2013 - 18:54
la source
0

Si vous utilisez une requête personnalisée comme celle-ci

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

Dans ce cas, vous ne rencontrerez aucun problème. Sinon, s'il y a une autre boucle sur la même page, vous obtiendrez des résultats inattendus. Je n'ai pas utilisé wp_reset_query () dans le code ci-dessus (qui a été placé dans mon fichier header.php. Puis, lorsque je suis entré dans single.php, la plupart du temps, j'ai obtenu les pages de détails des autres catégories, ce qui était frustrant. oublié de réinitialiser la requête en haut. Bientôt, cela a fonctionné comme un charme.

    
réponse donnée Katie 16.06.2011 - 12:19
la source

Lire d'autres questions sur les étiquettes