WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

wp_reset_postdata() WP 3.0.0

Возвращает глобальную переменную $post в правильное состояние: в соответствие с текущим.

Функцию нужно использовать каждый раз после запуска произвольного цикла. Т.е. в случаях, когда на странице есть дополнительный цикл WordPress с использованием глобальной переменной $post (см. пример).

Если после цикла используется функция wp_reset_query() для «сброса данных», то wp_reset_postdata() использовать не обязательно.

Говоря простым языком, wp_reset_postdata() нужна, чтобы после вывода записей не ловить баги: пытаешься получить ID текущей записи (текущей страницы) - $post->ID, а получаешь ID другой записи. Тоже самое с заголовком, датой, контентом и т.д.

✈ 1 раз = 0.000011с = очень быстро | 50000 раз = 0.01с = скорость света PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

Ничего не возвращает.

Использование

<?php wp_reset_postdata(); ?>

Примеры

#1. Пример сброса данных поста и страницы

Этот пример полностью аналогичен работе функции wp_reset_query().

$original_query = $wp_query;

$wp_query = new WP_Query( $args );
if( have_posts() ){ 
	while( have_posts() ){
		the_post(); 
		the_title();
		the_excerpt(); 
	}
}
else
	echo 'Записей не найдено'; 

$wp_query = $original_query;

wp_reset_postdata();

#2. Когда нужно использовать wp_reset_postdata()?

Еще одни пример, показывающий в каких случаях нужно использовать wp_reset_postdata():

<?php $custom_query = new WP_Query('cat=-9');
while( $custom_query->have_posts() ) : $custom_query->the_post(); ?>

	<div <?php post_class(); ?> id="post-<?php the_ID(); ?>">
		<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
		<?php the_content(); ?>
	</div>

<?php endwhile; ?>
<?php wp_reset_postdata(); // reset the query ?>

#3. Альтернатива

В качестве альтернативы wp_reset_postdata() (в версиях ВП ниже 3.0), можно сначала записать $post во временную переменную $tmp_post, а после цикла вернуть прежнее значение переменной $post: $post = $tmp_post:

<?php
		global $post;
		$tmp_post = $post; // записываем данные
		$myposts = get_posts('numberposts=5&offset=1&category=1');
		foreach($myposts as $post) :
			setup_postdata($post);
	?>
	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php endforeach; ?>
	<?php $post = $tmp_post; // возвращаем данные ?>

Заметки

С версии 3.0. функция использует глобальную переменную $wp_query.

Код wp_reset_postdata: wp-includes/query.php VER 4.9.8

<?php
function wp_reset_postdata() {
	global $wp_query;

	if ( isset( $wp_query ) ) {
		$wp_query->reset_postdata();
	}
}

Cвязанные функции

Из метки: reset

Еще из раздела: Запросы

3 коммента
  • @ Lev cайт: mosthealthyproducts.com

    Добрый день. Я бы хотел спросить, правильным ли является этот код.

    $args = array( 'post_type' => 'ads', 'post__in' => explode(',',$t) );
    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();  
    $output .= '<div class="entry-content">'.get_the_content().'</div>';
    return $output;
    endwhile;
    wp_reset_postdata();

    Выводить то он выводит то, что мне надо. Но при вызове этого кода через шорткод внутри страницы, похоже, происходит ошибка. Все выводится, но Ваши хлебные крошки выдают Error: Taxonomy isn`t defined! Кроме того, исчезают комментарии.

    Спасибо.

    Ответить6.4 лет назад #
    • Никита

      wp_reset_postdata() выводить стоит перед return smile

      1
      Ответить1.4 год назад #
    • campusboy3061 cайт: www.youtube.com/c/wpplus

      Привет. Код не правильный. Как заметил Никита, return тут не в том месте, это порождает ошибки. К примеру, он делает так, что только первый элемент в $loop вернется, а их ведь может быть несколько, если в post__in придёт несколько ID постов. Во вторых, после return wp_reset_postdata() уже не сработает. Попробуй вот так:

      $args = array( 'post_type' => 'ads', 'post__in' => explode(',',$t) );
      $loop = new WP_Query( $args );
      $output = '';
      
      while ( $loop->have_posts() ) : $loop->the_post();  
      	$output .= '<div class="entry-content">'.get_the_content().'</div>';
      endwhile;
      
      wp_reset_postdata();
      
      return $output;
      1
      Ответить1.4 год назад #
Здравствуйте, !     Войти . Зарегистрироваться