Intereting Posts
Ограничение количества сообщений в WP_Query приводит к неожиданному результату Быстрая загрузка html5shiv для IE8 Реализация ленивой загрузки в сообщениях на главной странице вместо разбивки на страницы Get_template_part внутри папки Разбивка страницы с помощью статической передней страницы Самое популярное сообщение за последние 7 дней Эффективно сортировать только определенные категории по специальному полю Как иметь более одной страницы для своих сообщений, если у вас есть 8 сообщений, но может хранить max 4 на странице Как показывать теги Правильный способ включить blog-header.php? Удалить содержимое HTML, если атрибут не установлен / переменные атрибуты Как просмотреть зарегистрированные syles и скрипты для очереди Как получить meta_value и meta_key в матрице после запроса ajax по post_id Ограничить поисковый запрос до определенной даты Как создать миниатюру сообщения

Почему я должен поставить if (has_posts ()), пока (has_posts ()) недостаточно?

У меня вопрос о «петле».

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php endwhile; else: ?> <p><?php _e('Sorry, no posts matched your criteria.'); ?></p> <?php endif; ?> 

Код, взятый из страницы Code Loop WordPress Codex .

Почему я должен класть, if часть? Кажется, что если есть цикл while, он работает нормально.

В каком случае проблема возникает, если нет инструкции if ?

редактировать

Я принял ответ Чипа. но честно говоря, мне нужна только последняя часть.

Теперь я знаю, что хотел узнать из моего вопроса.

if если необходимо, если вы хотите поместить верхний или нижний колонтитул, который должен быть написан только один раз. если вы не используете «обертку», то оператор if не нужен.

Solutions Collecting From Web of "Почему я должен поставить if (has_posts ()), пока (has_posts ()) недостаточно?"

Загрузчик шаблонов WordPress будет включать в себя соответствующий файл контекстного шаблона во многих случаях, даже если запрос для этого контекста не возвращает сообщений. Например:

  • Основной блог
  • Индекс архива категории (Категория существует, но нет сообщений)
  • Индекс индекса тегов (тег существует, но нет сообщений)
  • Авторский указатель архива (автор существует, но нет сообщений)
  • Индекс результатов поиска

Таким образом, в этих случаях будет загружен соответствующий файл шаблона, но никакие сообщения не будут выводиться, потому что запрос не возвращает сообщений.

Примеры доказательств:

  • Категория существует, но не имеет сообщений (включая шаблон категории)
  • Категория не существует (включено 404 шаблона)

Таким образом, в этих контекстах полезно, чтобы файл шаблона включал if ( have_posts() ) .

В других контекстах файл шаблона никогда не будет загружен, если запрос не возвращает сообщений. Например:

  • Одиночный блог
  • Статическая страница

В этих контекстах, if ( have_posts() ) , вероятно, не нужно.

редактировать

Я понимаю, что запрос вызывается the_post (), правильно? И если while (has_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} ), такую ​​как отдельные сообщения в блоге и статические страницы, потому что сообщение на самом деле не существует, и при анализе запрос не вернет действительный объект ,

Изменить 2

Если я правильно понимаю, нет ли if (has_posts ()) в шаблоне категории, а в категории нет сообщения, тогда он возвращает 404.php, хотя он должен быть возвращен category-sample.php без сообщения. Это правильно?

Нет. Помните: шаблон выбирается в template_redirect . Поэтому, если запрос действителен, то загружается соответствующий файл шаблона. Если запрос недействителен, загружается шаблон 404.

Итак, как только шаблон загружен – например, шаблон категории – после вывода цикла, шаблон не изменяется .

Посмотрите еще раз на порядок действий:

  • parse_query
  • pre_get_posts
  • wp
  • template_redirectздесь выбран и загружен шаблон. Это точка шаблона без возврата . После этого момента шаблон не может измениться.
  • the_postpostdata устанавливается здесь, как часть вызова цикла. Это вызывается внутри шаблона , и шаблон не изменяется на основе доступных данных в объекте запроса

Редактировать

И я утверждаю, что, проверяя наличие сообщений, почему я должен запускать один и тот же тест дважды. Это мой вопрос с первого момента, о котором я только просил.

И с этим я, наконец, понимаю: все время ваш вопрос не имел никакого отношения к WordPress или WordPress Loop . Вы спрашиваете об упаковке любого произвольного цикла PHP while в if который проверяет одно и то же условие.

Этот вопрос выходит за рамки WPSE, но я кратко объясню:

Условие if является двоичной оценкой: это либо true либо false , и то, что происходит внутри этого условного, выполняется один раз .

Некоторое условие – это цикл : он остается верным для некоторого дискретного периода, основанного на каком-то счетчике; и то, что происходит внутри этого условного, выполняется несколько раз – один раз для каждой итерации счетчика.

Итак, предположим, что вы хотите вывести неупорядоченный список вещей, если список вещей заполнен. Если вы используете цикл 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 выполняет совершенно другую цель, чем цикл while.

На самом деле невозможно улучшить ответ Чипа, но просто прервать погоню:

Используйте if если вы хотите, чтобы что-то другое отображалось, когда нет сообщений . Это особенно полезно, например, на странице даты или категории. Если кто-то переходит к странице, на которой нет сообщений, приятно иметь сообщение, которое так говорит, а не просто ничего не появляется вообще, потому что цикл никогда не выполняется.

 if ( have_posts() ): // Yep, we have posts, so let's loop through them. while ( have_posts() ) : the_post(); // do your loop endwhile; else : // No, we don't have any posts, so maybe we display a nice message echo "<p class='no-posts'>" . __( "Sorry, there are no posts at this time." ) . "</p>"; endif; 

Я рассматриваю это как фундаментальный вопрос теории структуры управления. Закрытый блок внутри цикла while не выполняется даже один раз, если условие (has_posts ()) в первый раз оценивается как false.

Таким образом, цель if ( have_posts() ) в цикле WordPress состоит только в том, чтобы выполнить функцию has_posts () один раз перед вычислением условия while. Если have_posts() не имеет побочных эффектов, то if ( have_posts() ) совершенно бессмысленно. Если have_posts() имеет побочные эффекты, вы можете упростить следующее:

 <?php have_posts(); ?> <?php while ( have_posts() ) : the_post(); ?> <?php endwhile; else: ?> <p><?php _e('Sorry, no posts matched your criteria.'); ?></p> <?php endif; ?>