Завантажувач шаблонів 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
.
Це не відповідає дійсності для запитів, що включають змінну публікації ( &p={ID}
), таку як окремі публікації блогу та статичні сторінки, оскільки публікація насправді не існує, і при розборі запит не поверне дійсний об’єкт.
Редагувати 2
Якщо я правильно розумію, що якщо в шаблоні категорії немає (if_posts ()), а категорія не має посади, то вона повертає 404.php, навіть незважаючи на те, що вона повинна повернути категорію-sample.php без публікації. Це так?
Ні. Пам'ятайте: шаблон обраний на template_redirect
. Тож якщо запит дійсний, то завантажується відповідний файл шаблону. Якщо запит недійсний, завантажується шаблон 404.
Отже, щойно шаблон завантажується - наприклад, шаблон категорії - щойно цикл виводиться, шаблон не змінюється .
Подивіться ще раз на порядок дій:
parse_query
pre_get_posts
wp
template_redirect
- тут обраний і завантажений шаблон. Це шаблон шаблону без повернення . Шаблон не може змінитися після цього пункту.
- ...
the_post
- тут налаштовано постдані, як частина виклику циклу. Це називається всередині шаблону , і шаблон не змінюється на основі наявних даних в об’єкті запиту
Остаточна редакція
І я стверджую, що, перевіряючи наявність дописів, чому я повинен запускати один і той же тест двічі. Це моє запитання з першого моменту, про яке я питав лише про це.
І з цим я нарешті розумію: все ваше запитання не мало нічого спільного ні з WordPress , ні з циклом WordPress . Ви запитуєте про загортання будь-якого довільного while
циклу PHP всередині if
умовного, що перевіряє те саме умова.
Це питання виходить за рамки WPSE, але я коротко поясню:
Умовне if
- це двійкове оцінювання: воно true
або false
, і те, що відбувається всередині цього умовного, виконується один раз .
Умовним 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
петля.