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 Проверка есть ли еще посты в цикле
Если нужно проверить есть ли еще посты в текущем цикле, можно использовать следующую функцию.
Использовать функцию more_posts() нужно будет вместо have_posts().
function more_posts() {
global $wp_query;
return $wp_query->current_post + 1 < $wp_query->post_count;
}
Функция будет возвращать:
- true - есть еще посты в запросе.
- false - выведен последний пост.
#2 Определим есть ли записи для вывода
Следующий пример можно использовать, чтобы определить есть ли посты для вывода и если есть запустить цикл while и вывести их:
<?php
if ( have_posts() ){
while ( have_posts() ){
the_post();
// код вывода
}
} else {
echo wpautop( 'Постов для вывода не найдено.' );
}
?> #3 Вызов have_posts() внутри Цикла WordPress
Вызов have_posts() внутри Цикла WordPress, означает бесконечный цикл. Смотрите пример:
while( have_posts() ){
the_post();
// Вывод поста
if ( have_posts() ){
// Если это последний пост, цикл начнется заново
// Делаем что-нибудь, если это не не последний пост
}
}
Заметки
- Global. WP_Query.
$wp_queryWordPress Query object.
Список изменений
| С версии 1.5.0 | Введена. |
Код have_posts() have posts WP 7.0.3
function have_posts() {
global $wp_query;
if ( ! isset( $wp_query ) ) {
return false;
}
return $wp_query->have_posts();
}