setup_postdata()

Устанавливает значения глобальных переменных исходя из переданного объекта поста.

Вообще, она нужна для того, чтобы в циклах функции get_posts() или же прямого вывода постов из БД работали такие функции, как the_title(), the_permalink() и так далее.

setup_postdata( $post );
$post
(объект) объект поста, который обязательно кстати должен называться $post, иначе функция просто не будет работать.

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

$id
Значение будет взято из переданного объекта $post->ID.
$authordata
Объект с информацией об авторе поста, является результатом:

$authordata = get_userdata($post->post_author);
$currentday
Дата публикации поста в формате d.m.y.
$currentmonth
Месяц, в который пост был опубликован в формате m.
$page
Текущая страница контента поста.
$pages
Массив содержимого страниц контента поста.
$numpages
Общее количество страниц, по сути является count( $pages ).
$multipage
Равняется единице, если контент поста состоит из нескольких страниц (разделенных тегом
<!--nextpage-->), иначе равен нулю.
$more
О том, что означает эта переменная, я уже писал здесь. Сейчас я лишь скажу, что setup_postdata() установит её значение, равному единице в следующих случаях:

  • При выполнении хотя бы одного из условий: is_single(), is_page() или is_feed().
  • Если $page больше единицы.

Также должен отметить, что функция возвращает false в двух случаях:

  • Если глобальная переменная $wp_query не задана.
  • Если $wp_query не является объектом класса WP_Query.

Примеры

1. Цикл функции get_posts()

Давайте вытащим несколько постов из базы при помощи функции get_posts(), если в теле цикла попробовать вывести заголовок через get_the_title() или ссылку через get_permalink() — у нас ничего не выйдет, эта проблема решается следующим образом:

$args = array(
	'posts_per_page' => 5,
	'orderby'        => 'name'
);
$posts = get_posts( $args );
foreach( $posts as $post ) {
	setup_postdata($post); // так решается проблема функций get_permalink() и get_the_title()
	echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a>';
}
wp_reset_postdata();

2. Цикл при выводе постов из базы данных

global $wpdb, $post;
$db_query = "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish'"; // все опубликованные записи
$db_results = $wpdb->get_results($db_query);
foreach($db_results as $post) {
	setup_postdata($post); 
	echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a>';
}
wp_reset_postdata();

Для того, чтобы последующие циклы на странице работали корректно, то после завершения текущих дополнительных циклов не помешает добавить функцию wp_reset_postdata().

Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.