WordPress как на ладони
rgbcode is looking for WordPress developers. Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

have_posts()WP 1.5.0

Проверяет есть ли в global $wp_query посты для обработки. Ставит in_the_loop = false если цикл закончен. Условный тег.

Эта функция используется в связке с функций the_post().

while ( have_posts() ) {
	the_post();

	the_title();
}

have_posts() работает только с глобальной переменной $wp_query. Поэтому, если вы создаете кастомный запрос, то вам нужно использовать одноименный метод рабочего объекта:

$query = new WP_Query( $args );

while ( $query->have_posts() ) {
	$query->the_post();

	// ...
}

wp_reset_postdata(); // ВАЖНО вернуть global $post обратно
Как have_posts() работает в цикле.

Разберем на примере такого цикла (кода):

while ( have_posts() ) {
	the_post();
}

В первую очередь have_posts() проверяет есть ли в $wp_query хоть один пост:

  • Если постов нет, то have_posts() запускает хук loop_no_results, выставляет in_the_loop = false и возвращает false.

  • Если посты есть, то возвращается true и цикл запускается:

    1. При первой итерации цикла, the_post() переключается на следующий пост в цикле (для первой итерации это будет первый пост в цикле) и устанавливает данные этого поста в global $post.

      Также, the_post() устанавливает другие данные поста в глобальные переменные (см. setup_postdata( $post )) и включает свойство in_the_loop = true. Подробнее смотрите the_post().

    2. При второй и последующих итерациях цикла, have_posts() также проверяет есть ли в цикле следующий пост, the_post() переключается на этот следующий пост и как и до этого записывает его в global $post.

    3. При окончании цикла, когда постов в цикле не осталось, have_posts() запускает хук loop_end, перематывает цикл в исходное состояние, см. rewind_posts(), отключает свойство in_the_loop = false и возвращает false - таким образом цикл заканчивается.
Работает на основе: WP_Query::have_posts()
1 раз — 0.000001 сек (скорость света) | 50000 раз — 0.02 сек (скорость света) | PHP 7.2.5, WP 4.9.6

Хуков нет.

Возвращает

true|false. falsе, если результатов для вывода нет и true, если есть что выводить.

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

// not loop
if( have_posts() ){
	// ...
}

// loop
while ( have_posts() ) {
	the_post();

	// ...
}

Примеры

1

#1 Вызов have_posts() внутри Цикла WordPress

Вызов have_posts() внутри Цикла WordPress, означает бесконечный цикл. Смотрите пример:

while( have_posts() ){
	the_post();

	// Вывод поста
	if ( have_posts() ){
		// Если это последний пост, цикл начнется заново
		// Делаем что-нибудь, если это не не последний пост
	}
}
0

#2 Определим есть ли записи для вывода

Следующий пример можно использовать, чтобы определить есть ли посты для вывода и если есть запустить цикл while и вывести их:

<?php
if ( have_posts() ){
	while ( have_posts() ){
		the_post();
		// код вывода
	}
} else {
	echo wpautop( 'Постов для вывода не найдено.' );
}
?>
0

#3 Проверка есть ли еще посты в цикле

Если нужно проверить есть ли еще посты в текущем цикле, можно использовать следующую функцию.

Использовать функцию more_posts() нужно будет вместо have_posts().

function more_posts() {
  global $wp_query;

  return $wp_query->current_post + 1 < $wp_query->post_count;
}

Функция будет возвращать:

  • true - есть еще посты в запросе.
  • false - выведен последний пост.

Заметки

  • Global. WP_Query. $wp_query WordPress Query object.

Список изменений

С версии 1.5.0 Введена.

Код have_posts() WP 6.4.3

function have_posts() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return false;
	}

	return $wp_query->have_posts();
}
15 комментариев
Полезные 1 Все
    Войти