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().

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.