Загрузчик шаблонов WordPress будет включать соответствующий контекстный файл шаблона во многих случаях, даже если запрос для этого контекста не возвращает сообщений. Например:
- Индекс главных сообщений в блоге
- Индекс архива категории (категория существует, но не имеет сообщений)
- Индекс архива тегов (тег существует, но не имеет сообщений)
- Указатель архива автора (Автор существует, но не имеет сообщений)
- Индекс результатов поиска
Таким образом, в этих случаях будет загружен соответствующий файл шаблона, но сообщения не будут выводиться, поскольку запрос не возвращает сообщений.
Примеры подтверждения концепции:
Таким образом, в этих контекстах полезно, чтобы файл шаблона включал if ( have_posts() )
условные выражения.
В других контекстах файл шаблона никогда не будет загружен, если запрос не возвращает сообщений. Например:
- Одиночная запись в блоге
- Статическая страница
В этих условиях, if ( have_posts() )
вероятно, нет необходимости.
редактировать
Я понимаю, что запрос вызывается the_post (), верно? И если while (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
- Шаблон выбран:
- Шаблон загружен / вывод. Следующие действия выполняются шаблоном :
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
Если я правильно понимаю, что в шаблоне категории нет if (have_posts ()), а в категории нет записей, тогда возвращается 404.php, даже если должен возвращаться category-sample.php без записи. Это правильно?
Помните: шаблон выбран в 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
оболочку, ваша разметка будет выглядеть так:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
И если бы он list_of_things()
был пустым, вывод был бы:
<ul>
</ul>
Что оставляет ненужную (и недействительную) разметку.
Но если вы добавите в if
условную оболочку, вы можете сделать это:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
А если бы он list_of_things()
был пустым, никакая разметка вообще не выводилась бы.
Это только один пример. Существует много вариантов использования этой if
условной оболочки, и if
условная оболочка служит совершенно иным целям, чем while
цикл.