Чи потрібно використовувати wp_reset_query () для дзвінка WP_Query?


26

Я використовую наступний код для отримання публікацій:

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

Чи потрібно використовувати wp_reset_query()? Якщо я це роблю, куди мені це розмістити?



2
Якщо ви покладаєтесь на основний об’єкт запиту десь ще на сторінці, то так! вам слід зателефонувати, щоб переконатися, що основний об’єкт запиту містить дані, зроблені перед тим, як ви повторили ваш власний запит. Коли ви викликаєте the_post()метод (тобто $my_custom_query->the_post()), ви поповнюєте змінні публікації, на які дивиться основний запит, скидання поповнює ці параметри попередніми даними, коли ви його викликаєте. Корисна практика використовувати скидання даних після користувацьких запитів.
t31о

Відповіді:


10

Привіт @janoChen:

Проста відповідь: ні.

Далі йде те, що PHP-код для функції wp_reset_query()з /wp-includes/query.phpWordPRess v3.0.4, а також функції, які згодом викликаються. Ви можете бачити, що мова йде в першу чергу про зміну глобальних змінних.

Під час використання new WP_Query($args)ви будете призначати повернене значення зі значень локальній змінній, тому, якщо ви не робите щось таке складне, що тоді вже знаєте відповідь на це запитання, ні, вам не потрібно дзвонити 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;
}

-Майк


@janoChen - хе. Він, безумовно, штовхає мене останнім часом, це точно! Я думаю, як кажуть, конкуренція покращує породу (але впевнено перешкоджає мені робити щось інше продуктивне!) -)
MikeSchinkel

1
Просто для інших, хто це читає, оскільки це все ще прийнята відповідь (@ відповідь Рарста слід прийняти). Оскільки ОП використовує the_post()у своєму коді, найкращі практики диктують, що він повинен використовувати wp_reset_postdata(). wp_reset_query()виклики wp_reset_postdata(), так що це спрацює, хоча інша справа wp_reset_query()- скидання $wp_queryглобальної змінної - не є необхідною, але в цьому випадку не є шкідливою. Тож відповідь насправді ТАК
Том Оже

21

Це не потрібно WP_Queryсаме по собі, але необхідно (або принаймні добре робити), якщо ви використовуєте будь-які пов'язані функції / методи (наприклад, the_post()або setup_postdata()) для заповнення глобальних змінних вашими даними.

В основному створення нового WP_Queryоб’єкта - це просто пошук даних, але його використання для запуску активного циклу та надання даних доступними для тегів шаблонів змінює середовище, і добре після цього все скинути.

Загалом - це не має сенсу покарання за виконання вимог, тому його легше завжди називати, ніж вирішувати, чи потрібно це забути чи забути щось таємниче.

Оновлення

wp_reset_postdata()Функція, здається, є більш підходящим вибором. wp_reset_query()скидає глобальні $wp_query(на які спеціальний WP_Queryоб'єкт не впливає) та $post (що може бути, як вище) змінні. wp_reset_postdata()лише відновлює $post, чого має бути достатньо.


2

Ні. Якщо ви створили власний об'єкт WP_Query, то це ваше стосується того, що ви хочете. Однак, якщо ви підробляєте global $wp_queryзмінну, ну, то ваша у глобальній області імен впливає на будь-який сценарій, який одночасно використовує цю змінну. І якщо ви щось зробите, щоб змінити дані в них, ви також повинні скинути їх після того, як ви зробили їх використання.


0

Якщо ви використовуєте власні запити, як це

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

Тоді ви не зіткнетесь з проблемами. В іншому випадку, якщо на одній сторінці є ще одна петля, ви отримаєте неочікувані результати. Я не використовував wp_reset_query () у наведеному вище коді (який був розміщений у моєму файлі header.php. Потім, коли я потрапив у single.php, я здебільшого отримую сторінки з деталями інших категорій, що засмучує. Пізніше я зрозумів, що я забув скинути запит у верхній частині. Незабаром він почав працювати як шарм.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.