У меня вопрос по поводу "петли".
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Код взят со страницы Кодекса The Loop WordPress .
Почему я должен поставить if
часть? Кажется, если есть while
петля, работает нормально.
В каком случае возникает проблема, если нет if
заявления?
редактировать
Я принял ответ @ Чипа. но, честно говоря, мне нужна только последняя часть.
Теперь я знаю, что я хотел узнать из моего вопроса.
if
Заявление только в случае необходимости, если вы хотите поставить верхний или нижний колонтитул, который должен быть записан только один раз. если вы не используете «обертку», тоif
утверждение не нужно.
Ответы:
Загрузчик шаблонов WordPress будет включать соответствующий контекстный файл шаблона во многих случаях, даже если запрос для этого контекста не возвращает сообщений. Например:
Таким образом, в этих случаях будет загружен соответствующий файл шаблона, но сообщения не будут выводиться, поскольку запрос не возвращает сообщений.
Примеры подтверждения концепции:
Таким образом, в этих контекстах полезно, чтобы файл шаблона включал
if ( have_posts() )
условные выражения.В других контекстах файл шаблона никогда не будет загружен, если запрос не возвращает сообщений. Например:
В этих условиях,
if ( have_posts() )
вероятно, нет необходимости.редактировать
Чтобы понять, что происходит, вы должны посмотреть на порядок действий WordPress . Начиная с
wp_loaded
(и опуская некоторые для ясности):wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Итак, что происходит и в каком порядке?
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Таким образом,
the_post
срабатываниеthe_post()
происходит спустя много времени после анализа запроса, получения сообщений и загрузки шаблона.О, но я верю, что это именно то , что вы спросили.
Реальный вопрос: что такое верный запрос возврата ? Для таких контекстов, как индекс архива категории, запрос действителен, и шаблон категории загружается, если запрашиваемый идентификатор категории существует, даже если для этой категории нет записей .
Зачем? Поскольку анализируемый запрос - это (IIRC),
&cat={ID}
который является допустимым запросом, даже если нет записей, назначенных этой категории , и, следовательно, не приводит к 404 при разборе.В этом случае вы получите правильный запрос и загруженный файл шаблона, но ни одной записи . Таким образом,
if ( have_posts() )
, , на самом деле актуальна. Опять же, вот пример: категория существует, но не имеет назначенных сообщений. Файл шаблона категории загружается, сif ( have_posts() )
возвратомfalse
.Это не будет справедливо для запросов, которые включают переменную post (
&p={ID}
), такую как отдельные сообщения в блоге и статические страницы, потому что сообщение фактически не существует, и при разборе запрос не вернет допустимый объект.Edit 2
Помните: шаблон выбран в
template_redirect
. Так что если запрос допустим, то загружается соответствующий файл шаблона. Если запрос недействителен, загружается шаблон 404.Таким образом, после загрузки шаблона, например шаблона категории, после вывода цикла шаблон не изменяется .
Посмотрите еще раз на порядок действий:
parse_query
pre_get_posts
wp
template_redirect
- шаблон выбран и загружен здесь. Это шаблонная точка невозврата . Шаблон не может измениться после этой точки.the_post
- postdata устанавливается здесь как часть вызова цикла. Это вызывается внутри шаблона , и шаблон не изменяется в зависимости от доступных данных в объекте запроса.Окончательное редактирование
И с этим я наконец-то понимаю: ваш вопрос не имел ничего общего с WordPress или циклом WordPress . Вы просите обернуть любой произвольный
while
цикл PHP внутриif
условия, которое проверяет то же условие.Этот вопрос выходит за рамки WPSE, но я кратко объясню:
if
Условно является бинарной оценкой: илиtrue
илиfalse
, и того, что происходит внутри этого Conditional выполняется один раз .while
Условный является циклом : он остается верным в течение некоторого дискретного периода, основываясь на каком - то счетчик; и то, что происходит внутри этого условия, выполняется несколько раз - один раз для каждой итерации счетчика.Итак, допустим, что вы хотите вывести неупорядоченный список вещей, если этот список заполнен. Если вы используете
while
цикл и опускаетеif
оболочку, ваша разметка будет выглядеть так:И если бы он
list_of_things()
был пустым, вывод был бы:Что оставляет ненужную (и недействительную) разметку.
Но если вы добавите в
if
условную оболочку, вы можете сделать это:А если бы он
list_of_things()
был пустым, никакая разметка вообще не выводилась бы.Это только один пример. Существует много вариантов использования этой
if
условной оболочки, иif
условная оболочка служит совершенно иным целям, чемwhile
цикл.источник
the_post();
потому, что вwhile
них нет необходимости. +1 за полноту информации.if( have_posts() )
заявления имеет смысл (это то, что я пытаюсь выяснить), но не используйте его толькоthe_post()
на отдельных страницах!if( have_post() )
условие перед полным циклом в контексте файлов шаблонаsingle-*.php
иpage-*.php
?Действительно невозможно улучшить ответ Чипа, но просто перейти к преследованию:
Используйте
if
часть, если вы хотите, чтобы что-то другое отображалось, когда нет сообщений . Это особенно полезно, например, на странице архива даты или категории. Если кто-то переходит на страницу, на которой нет сообщений, было бы хорошо иметь сообщение, в котором говорится так, а не просто ничего не отображаться вообще, потому что цикл никогда не выполняется.источник
Могут быть некоторые соображения, которые пока не включены в ответы. Не рекомендуется опускать оператор if.
Оператор if обычно используется для:
no posts found
чтобы указать, что рассматриваемая категория не имеет назначенных статей.Что если новый хук добавлен?
Другая возможная проблема неиспользования оператора if заключается в том, что если команда WordPress решила добавить новый хук, который срабатывает при первом
$wp_query->have_posts()
вызове, он сработает в неподходящее время. И если это приведет к неожиданному поведению, это будет ваша вина за то, что вы не следовали спецификации должным образом.Другие разработчики ожидают увидеть конкретную структуру для цикла WordPress
Я предполагаю, что другие разработчики ожидают увидеть весь цикл WordPress. Поэтому, может быть, это плохая идея, чтобы они искали оператор if, которого там нет.
источник
Я рассматриваю это как фундаментальный вопрос теории структуры управления. Закрытый блок в цикле while не выполняется ни разу, если условие (have_posts ()) в первый раз оценивается как ложное.
Таким образом, цель
if ( have_posts() )
цикла WordPress - выполнить функцию have_posts () только один раз до того, как будет выполнено условие while. Еслиhave_posts()
не имеет побочных эффектов, тоif ( have_posts() )
совершенно бессмысленно. Еслиhave_posts()
есть побочные эффекты, вы можете упростить это следующим образом:источник
if
там из-заelse
после этого. Нет другой причины. Если сообщений нет, тогда показывать приятное сообщение «нет сообщений» лучше, чем ничего.