WordPress как на ладони

wp_reset_postdata()WP 3.0.0

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

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

Эта функция нужна, чтобы после вывода записей не ловить баги. Примеры возможных багов:

  • Пытаешься получить ID текущей записи (текущей страницы) через $post->ID, а получаешь ID другой записи.
  • Пытаешься получить заголовок, дату, контент текущей страницы, а получаешь от другой.

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

Работает на основе: WP_Query::reset_postdata()
1 раз — 0.000011 сек (очень быстро) | 50000 раз — 0.01 сек (скорость света) | PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

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

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

wp_reset_postdata();

Примеры

1

#1 Когда нужно использовать 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
}
wp_reset_postdata(); // reset the query
?>
0

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

Этот пример полностью аналогичен работе функции 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();
0

#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
}
$post = $tmp_post; // возвращаем данные
?>

Заметки

  • Global. WP_Query. $wp_query WordPress Query object.

Список изменений

С версии 3.0.0 Введена.

Код wp_reset_postdata() WP 6.5.2

function wp_reset_postdata() {
	global $wp_query;

	if ( isset( $wp_query ) ) {
		$wp_query->reset_postdata();
	}
}
3 комментария
    Войти