setup_postdata()
Встановлює всілякі дані посту (крім глобальної змінної $post ).
Заповнює глобальні змінні, які потрібні для коректної роботи деяких is_new_day() .
Встановлює такі глобальні змінні:
$id $authordata $currentday $currentmonth $page $pages $multipage $more $numpages
Функція не встановлює змінну $post як глобальну. Тому потрібно зробити це самостійно.
Функція очікує, що передана змінна має той самий об’єкт як і глобальна змінна $post. Тобто. передана змінна має бути глобальним об’єктом $post. Якщо функція використовується всередині циклу, потрібно передати поточний об’єкт посту в циклі.
Завжди, коли ця функція використовується, після циклу потрібно скидати глобальну змінну $post за допомогою wp_reset_postdata() .
Дивіться функцію the_post() – вона працює на основі цієї функції.
WP_Query::setup_postdata()
the_post()
(швидко) | 50000 разів – 5.16 сек
(швидко)
Хуків немає.
Повертає
true|false
. Майже завжди вертає true. Поверне false, коли глобальна змінна $wp_query не встановлена або не є WP_Query об’єктом .
Використання
global $post; setup_postdata($post);
-
$post
(об’єкт/число) (обов’язковий) - Об’єкт або ID поточного посту.
Приклади
#1 Як правильно передавати аргумент $post
Допустимо ми отримуємо дані посту в змінну $post_object , тоді нам потрібно створити змінну з назвою $post і передати ці дані. setup_postdata() працює саме з глобальною змінною $post .
global $post; // Змінимо глоб. $post - це потрібно обов'язково, але це не входить // Завдання функції setup_postdata() $post = $post_object; setup_postdata($post); // або setup_postdata($post_object); // Використовуємо Теги Шаблону // the_title(); // Наприкінці всіх операцій обов'язково повертаємо $post у вихідну wp_reset_postdata();
Короткий запис прикладу вище:
setup_postdata( $GLOBALS['post'] = $post_object );
А ось так неправильно:
global $post; setup_postdata($post_object); // опс
#2 Приклад із циклом get_posts()
Отримаємо пости з категорії 1 та виведемо їх у вигляді посилань:
<ul> <?php global $post; $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 ); $ myposts = get_posts ($ args); foreach( $myposts as $post ){ setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php } wp_reset_postdata(); ?> </ul>
#3 Отримаємо пости прямим запитом із бази даних
<ul> <?php Global $wpdb, $post; $result = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish'" ); foreach($result as $post){ setup_postdata($post); ?> <li><a href="<?php the_permalink()?>"><?php the_title();?></a></li> <?php } wp_reset_postdata(); ?> </ul>
#4 Якщо аргумент функції передати не $post
Демонстрація того, що вийде, якщо як аргумент передати не глобальну змінну $post , а будь-яку іншу – функція не працюватиме як потрібно:
global $post; // Неправильно! $posts = get_posts("posts_per_page=2"); foreach( $posts as $pst ){ setup_postdata($pst); echo the_title(); echo '<br>'; } echo '$post->post_title - '. $post->post_title . '<br>'; /* Поверне: Заголовок поточної сторінки Заголовок поточної сторінки $post->post_title - Заголовок поточної сторінки */ // Правильно! // повторюємо тільки визначимо $post $posts = get_posts("posts_per_page=2"); foreach( $posts as $pst ){ $post = $pst; setup_postdata($pst); echo the_title(); echo '<br>'; } echo '$post->post_title - '. $post->post_title . '<br>'; /* Поверне: Заголовок отриманого посту Заголовок другого отриманого посту $post->post_title - Заголовок другого отриманого поста */ // Правильно! // повторюємо лише з $post замість $pst $posts = get_posts("posts_per_page=2"); foreach( $posts as $post ){ setup_postdata($post); echo the_title(); echo '<br>'; } echo '$post->post_title - '. $post->post_title . '<br>'; /* Поверне теж, що й код до цього: Заголовок отриманого посту Заголовок другого отриманого посту $post->post_title - Заголовок другого отриманого поста */
#5 Ще приклад, що пояснює роботу setup_postdata()
Цей приклад взято з коментаря користувача:
Запитання:
Вітаю! Здається я щось не розумію:
1) Такий код:
$top_posts = get_posts([ 'posts_per_page' => 5, ]); if ($top_posts) { foreach ( $top_posts as $post ) { // setup_postdata($post); the_title(); echo '<hr>'; } } wp_reset_postdata();
Працює нормально, виводить те, що потрібно. Навіщо використовувати setup_postdata($post); ?
2) Такий код:
$top_posts = get_posts([ 'posts_per_page' => 5, ]); if ($top_posts) { foreach ($top_posts as $item) { setup_postdata($item); the_title(); echo '<hr>'; } } wp_reset_postdata();
Виводить 5 разів заголовок першого запису. Отут взагалі не зрозумів, чому? Хіба обов’язкове ім’я змінної $post при переборі циклу?
Відповідь:
1 код
В описі setup_postdata() написано навіщо вона потрібна:
Заповнює глобальні змінні: $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages. Вони потрібні для коректної роботи тегів шаблону, які повинні використовуватися всередині циклу WordPress.
Тобто. без неї деякі теги шаблону працюватимуть некоректно! Для конкретно the_title() вона не потрібна…
2 код
the_title() і подібні до неї працюють саме з $post , вказуючи $post для foreach ти як би змінюєш значення глобальної $post на поточне, а якщо вказуєш $item , то перевизначення не відбувається, тому 5 однакових заголовків…
setup_postdata() у цьому питанні не фігурує, у нього інше завдання – визначити інші глоб.змінні крім $post потрібні для тегів шаблону. Наприклад, можна написати так:
... foreach ($top_posts as $item) { $post = $item; // Перепишемо глоб. `$post` setup_postdata($item); the_title(); echo '<hr>'; } ...
І з цього коду видно, що простіше відразу використовувати $post …
Крім того, у тебе в коді немає визначення $post як глобальної, а це означає, що твій код знаходиться в якомусь файлі безпосередньо (тобто він у глобальній області видимості PHP) і тому там $post вже глобальна. Так наприклад, якщо обернути твій код на функцію, то на початку функції потрібно буде написати global $post , щоб $post була глобальною, коли використовується всередині функції (у локальній області видимості коду). Інакше теги шаблону типу the_title() правильно не працюватимуть.
нотатки
- Global. WP_Query. $wp_query WordPress Query object.
список змін
З версії 1.5.0 | Введено. |
З версії 4.4.0 | Added ability to pass a post ID до $post . |
Код setup_postdata() setup postdata WP 6.0.2
function setup_postdata( $post ) { global $wp_query; if ( ! empty( $wp_query ) && $wp_query instanceof WP_Query ) { return $wp_query->setup_postdata( $post ); } return false; }