Необходимо ли использовать 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()Е.), Вы пополняете переменные записи, на которые смотрит основной запрос, сброс перезаполняет эти переменные предыдущими данными, когда вы их вызываете. Рекомендуется использовать перезагрузки после пользовательских запросов.
t31os

Ответы:


10

Привет @janoChen:

Простой ответ: нет.

Ниже то , что PHP - код для функции wp_reset_query()от /wp-includes/query.phpв WORDPRESS 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
Просто для других, читающих это, так как это все еще принятый ответ (ответ @ Rarst должен быть принят). Поскольку ОП использует 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.