Циклы – не самая лёгкая для понимания тема в изучении WordPress, поэтому возможно вам будет легче изучить её при помощи моего видеоурока.
Обратите внимание, что эта функция только для основного цикла. Если мы работаем с дополнительным циклом при помощи WP_Query, то используем метод класса WP_Query::have_posts()
.
Ещё раз о том, что делает функция, подробнее:
if( have_posts() )
– тут всё просто, если есть посты на странице – return true
, нет – false
.while( have_posts() )
, ситуация становится интереснее. Как вы знаете, у нас есть функции для вывода параметров текущего поста, например the_title(), the_permalink(). Как они определяют, что это тот самый пост? При помощи функции the_post(), которая при каждой итерации цикла хватает следующий пост в очереди. А что происходит, когда очередь заканчивается? – тогда while ( have_posts() )
возвращает false
и цикл завершается. Однако (!) в то же время функция have_posts()
также делает и сброс значения текущего поста, возвращаясь к самому первому на этой странице! 🎉В шаблонах тем WordPress можно часто встретить подобную запись:
if( have_posts() ) : while( have_posts() ) : the_post(); // тут обычно что-то происходит endwhile; else : echo 'Ничего не найдено на этой странице'; endif;
if ( have_posts() ) :
, мы проверяем, есть ли вообще посты на этой странице? Это может быть страница рубрики, или главная – неважно. Если эта, предположим рубрика, пуста, то выводим «Ничего не найдено…» и больше ничего не делаем.have_posts()
вернёт false
, а если не производить «этот сдвиг», то have_posts()
всегда будет возвращать true
.Такую запись можно встретить не часто, однако она важна для понимания сути.
while( have_posts() ) : the_post(); // тут обычно что-то происходит endwhile; while( have_posts() ) : the_post(); // невероятные вещи продолжают происходить endwhile;
Как такая запись вообще возможна?
Об этом я и говорил в самом начале, когда упомянул сброс цикла. Когда функция the_post() доводит цикл до конца, у нас происходит сразу две вещи:
have_posts()
возвращает false
,have_posts()
сбрасывает цикл, устанавливая значение текущего поста на самый первый пост на странице;Или ещё можно сказать – для последней итерации цикла while ( have_posts() )
. Обычно, когда идёт разговор об итерациях цикла, первое, что приходит в голову (мою), это уроки информатики с переменными-счетчиками.
Но только не сегодня.
while( have_posts() ) : the_post(); // ... выводится пост например if( ! have_posts() ) { echo 'это последний пост цикла'; } endwhile;
Стоп! Не копируйте, прошу!
Что думаете про этот код? Норм или что-то смущает?
Представьте:
have_posts()
(строка 5) определяет, что это последний пост, возвращает false
, и соответственно выводится месседж «это последний пост цикла».have_posts()
сбрасывает текущий пост цикла и всё начинается снова, так и не закончившись!Как исправить? Вместо условия have_posts()
на 5-й строке используем другое условие:
global $wp_query; if( $wp_query->current_post + 1 == $wp_query->post_count ) { echo 'это последний пост цикла'; }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Привет, Миш! Еще раз спасибо за твою работу и твой вклад в наши головы)
Тут есть такой вопрос по выводу постов. На главной странице есть вывод постов определенной категории:
Если мы подключаем стартовый контент для темы напр
то вывода постов в превью кастомайзера не видно, т.е. виджеты есть, навигация, текст, настройки все есть, но постов нет. Я подумал что это связано с тем, что мы запрашиваем посты через WP_Query, а постов самих в базе еще нет и соответсвенно вывода тоже. Но страницы же есть. После клика по кнопке "опубликовать" в кастомайзере, посты эти добавляются.
Возможно ли сделать так чтобы этот вывод постов работал сразу в превью кастомайзера ?
Привет! Да, всегда пожалуйста 🙃
🤷♂️