WordPress как на ладони
wordpress jino

setup_postdata() WP 1.5

Устанавливает глобальные данные поста. Нужен для удобного использования Тегов шаблона связанных с оформление поста: the_title(), the_permalink() и т.д.

Заполняет глобальные переменные: $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages. Они нужны для корректной работы Тегов Шаблона, которые должны использоваться внутри Цикла WordPress.

Функция не устанавливает переменную $post как глобальную, а ожидает, что передаваемая переменная $post уже глобальная. Переданная переменная будет использована в функции как ссылка (& $post).

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

Работает на основе: WP_Query::setup_postdata()
✈ 1 раз = 0.000149с = быстро | 50000 раз = 5.16с = быстро

Хуков нет.

Возвращает

Всегда возвращает true.

Использование

global $post;
setup_postdata( $post );
$post(объект/число) (обязательный)
Объект или ID текущего поста.
Нужно передавать глобальную переменную $post иначе функции вроде the_title() работать не будут.

Примеры

#1 Как правильно передавать аргумент $post

global $post;

// Перенаправим полученные данные поста в переменную $post и не в какую другую.
$post = $post_object;

setup_postdata( $post );
// the_title();

Короткая запись примера выше:

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;
	global $post;
	$str = "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish'";
	$result = $wpdb->get_results($str);
	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 вместо $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 - Заголовок второго полученного поста
*/

Код setup postdata: wp-includes/query.php VER 4.9.1

<?php
function setup_postdata( $post ) {
	global $wp_query;

	if ( ! empty( $wp_query ) && $wp_query instanceof WP_Query ) {
		return $wp_query->setup_postdata( $post );
	}

	return false;
}

Cвязанные функции

Из метки: loop (Цикл WP)

Еще из метки: query (запрос)

Еще из раздела: Запросы

setup_postdata Комментариев нет

    Здравствуйте, !

    Ваш комментарий
    Предпросмотр