Что делает setup_postdata($post)?
В документации она определяется как 'Настройка глобальных данных записи. Помогает форматировать результаты пользовательских запросов для использования шаблонных тегов.' Это не очень понятное объяснение.
Вот пример кода:
global $post;
$args = array( 'numberposts' => -1);
$posts = get_posts($args);
foreach( $posts as $post) : setup_postdata($post);
echo $post->ID;
endforeach;
Поясню подробнее: функция setup_postdata() инициализирует глобальную переменную $post и настраивает все необходимые данные, чтобы стандартные функции WordPress (такие как the_title(), the_content(), the_excerpt() и другие шаблонные теги) работали корректно с текущей записью в цикле. Без этой функции шаблонные теги WordPress не смогут правильно получить информацию о текущей записи при использовании пользовательских запросов.

Функции тегов шаблонов используют глобальные переменные для доступа к обрабатываемой записи и получения данных из неё или связанных с ней.
Главной переменной среди них является $post
, которая содержит сам объект записи.
В вашем примере это не указано явно, но происходит следующее: ваш цикл присваивает данные переменной $post
. Если бы её имя было другим, вам пришлось бы указывать его явно (global $post; $post = $some_other_post;
).
Однако существует множество других глобальных переменных, и цель функции setup_postdata()
— заполнить их данными. Если посмотреть исходный код, это следующие переменные:
global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;
Обратите внимание, что в большинстве случаев после этого следует вызывать wp_reset_postdata()
, чтобы вернуть глобальные переменные в исходное состояние.
