Устанавливает значения глобальных переменных исходя из переданного объекта поста.
Вообще, она нужна для того, чтобы в циклах функции 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().
Источник: misha.blog