have_posts()
Проверяет есть ли в 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 и цикл запускается:
-
При первой итерации цикла, the_post() переключается на следующий пост в цикле (для первой итерации это будет первый пост в цикле) и устанавливает данные этого поста в global $post.
Также, the_post() устанавливает другие данные поста в глобальные переменные (см. setup_postdata( $post )) и включает свойство
in_the_loop = true
. Подробнее смотрите the_post(). -
При второй и последующих итерациях цикла, have_posts() также проверяет есть ли в цикле следующий пост, the_post() переключается на этот следующий пост и как и до этого записывает его в global $post.
- При окончании цикла, когда постов в цикле не осталось, have_posts() запускает хук loop_end, перематывает цикл в исходное состояние, см. rewind_posts(), отключает свойство
in_the_loop = false
и возвращает false - таким образом цикл заканчивается.
-
Хуков нет.
Возвращает
true|false
. falsе, если результатов для вывода нет и true, если есть что выводить.
Использование
// not loop if( have_posts() ){ // ... } // loop while ( have_posts() ) { the_post(); // ... }
Примеры
#1 Вызов have_posts() внутри Цикла WordPress
Вызов have_posts() внутри Цикла WordPress, означает бесконечный цикл. Смотрите пример:
while( have_posts() ){ the_post(); // Вывод поста if ( have_posts() ){ // Если это последний пост, цикл начнется заново // Делаем что-нибудь, если это не не последний пост } }
#2 Определим есть ли записи для вывода
Следующий пример можно использовать, чтобы определить есть ли посты для вывода и если есть запустить цикл while и вывести их:
<?php if ( have_posts() ){ while ( have_posts() ){ the_post(); // код вывода } } else { echo wpautop( 'Постов для вывода не найдено.' ); } ?>
#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() have posts WP 6.6.1
function have_posts() { global $wp_query; if ( ! isset( $wp_query ) ) { return false; } return $wp_query->have_posts(); }