# HAVE_POSTS() │ WP 1.5.0
Функция have_posts() проверяет, есть ли у глобальной переменной $wp_query посты для обработки. Это условная функция (conditional tag), которая используется в циклах WordPress.
## Как использовать have_posts() в циклах
Функция have_posts() обычно используется вместе с функцией the_post(), чтобы обрабатывать посты в цикле.
### Пример использования в цикле:
```php
while ( have_posts() ) {
the_post();
the_title();
}
Работа функции have_posts()
Функция have_posts() работает с глобальной переменной $wp_query. Если вы создаете пользовательский запрос, необходимо использовать объектный метод с тем же именем:
$query = new WP_Query( $args );
while ( $query->have_posts() ) {
$query->the_post();
// ...
}
wp_reset_postdata(); // Важно: возвращает глобальный $post в исходное состояние
Как работает have_posts() в цикле
Рассмотрим этот код как пример:
while ( have_posts() ) {
the_post();
}
-
Проверка постов:
have_posts()сначала проверяет, есть ли хотя бы один пост в$wp_query:- Если постов нет, функция вызывает хуки
loop_no_results, устанавливаетin_the_loopвfalseи возвращаетfalse. - Если посты есть, функция возвращает
true, и начинается цикл:
- Если постов нет, функция вызывает хуки
-
Первый проход цикла:
the_post()переключает на следующий пост (в первый раз это будет первый пост) и устанавливает его в глобальную$post.- Так��е
the_post()устанавливает другие данные поста в глобальные переменные (подробности вsetup_postdata( $post )) и включаетin_the_loop = true.
-
Следующие проходы:
- На втором и последующих проходах
have_posts()проверяет, есть ли следующий пост. Если есть,the_post()переключает на него и записывает в глобальную$post.
- На втором и последующих проходах
-
Конец цикла:
- Когда посты закончились,
have_posts()вызывает хукиloop_end, возвращает цикл в исходное состояние (с помощьюrewind_posts()) и устанавливаетin_the_loop = false, возвращаяfalse— это означает, что цикл завершен.
- Когда посты закончились,
Возврат
Функция возвращает:
false, если нет постов для вывода.true, если есть посты для вывода.
Пример использования
Пример 1: Проверка наличия постов
Этот пример показывает, как определить, есть ли посты для вывода. Если посты есть, запускается цикл для их отображения:
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// код для вывода поста
}
} else {
echo wpautop( 'Посты не найдены для вывода.' );
}
Пример 2: Вызов have_posts() внутри цикла WordPress
Вызов have_posts() внутри цикла WordPress может привести к бесконечному циклу:
while ( have_posts() ) {
the_post();
// Вывод поста
if ( have_posts() ) {
// Если это последний пост, цикл начнется заново
// Сделайте что-то, если это не последний пост
}
}
Пример 3: Проверка наличия следующих постов в текущем цикле
Если вы хотите проверить, есть ли еще посты в текущем цикле, можно использовать такую функцию:
function more_posts() {
global $wp_query;
return $wp_query->current_post + 1 < $wp_query->post_count;
}
Эта функция вернет:
true— если есть еще посты в запросе.false— если отображается последний пост.
Примечания
- Глобальная переменная:
WP_Queryи$wp_query— это объект запроса WordPress.
История изменений
- Введена в версии 1.5.0.
Как работает have_posts()
function have_posts() {
global $wp_query;
if ( ! isset( $wp_query ) ) {
return false;
}
return $wp_query->have_posts();
}
Связанные функции
esc_sql()get_children()get_pages()get_posts()setup_postdata()- и другие...
Условные теги
is_single()is_home()is_archive()- и другие...