wp_reset_postdata

Возвращает глобальную переменную $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

Хуков нет.

Возвращает

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

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

wp_reset_postdata();

Примеры

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

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

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

$wp_query = null;
$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 ?>
  1. В качестве альтернативы 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-includes/query.php

WP 4.7.2

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

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