Обратите внимание, что эта функция только для основного цикла. Если мы работаем с дополнительным циклом при помощи WP_Query, то используем метод класса WP_Query::have_posts()
.
Ещё раз о том, что делает функция, подробнее:
Пример 1. Стандартно
В шаблонах тем WordPress можно часто встретить подобную запись:
if( have_posts() ) : while( have_posts() ) : the_post(); // тут обычно что-то происходит endwhile; else : echo 'Ничего не найдено на этой странице'; endif;
Пример 2. Множество циклов
Такую запись можно встретить не часто, однако она важна для понимания сути.
while( have_posts() ) : the_post(); // тут обычно что-то происходит endwhile; while( have_posts() ) : the_post(); // невероятные вещи продолжают происходить endwhile;
Как такая запись вообще возможна?
Об этом я и говорил в самом начале, когда упомянул сброс цикла. Когда функция the_post() доводит цикл до конца, у нас происходит сразу две вещи:
Пример 3. Хитрое условие для последнего поста цикла
Или ещё можно сказать – для последней итерации цикла while ( have_posts() )
. Обычно, когда идёт разговор об итерациях цикла, первое, что приходит в голову (мою), это уроки информатики с переменными-счетчиками.
Но только не сегодня.
while( have_posts() ) : the_post(); // ... выводится пост например if( ! have_posts() ) { echo 'это последний пост цикла'; } endwhile;
Стоп! Не копируйте, прошу!
Что думаете про этот код? Норм или что-то смущает?
Представьте:
Как исправить? Вместо условия have_posts()
на 5-й строке используем другое условие:
global $wp_query; if( $wp_query->current_post + 1 == $wp_query->post_count ) { echo 'это последний пост цикла'; }