setup_postdata() WP 1.5.0

Встановлює всілякі дані посту (крім глобальної змінної $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()
1 раз – 0.000149 сек
(швидко) | 50000 разів – 5.16 сек
(швидко)

Хуків немає.

Повертає

true|false. Майже завжди вертає true. Поверне false, коли глобальна змінна $wp_query не встановлена ​​або не є WP_Query об’єктом .

Використання

global $post;
setup_postdata($post);
$post
(об’єкт/число) (обов’язковий)
Об’єкт або ID поточного посту.

Приклади

1

#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); // опс
0

#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>
0

#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>
0

#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 - Заголовок другого отриманого поста
*/
0

#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.0Added ability to pass a post ID до $post .

Код 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *