Я пытаюсь разобраться в трясине документации WP, и мне просто нужен кто-то, чтобы прояснить использование термина «Цикл» и его отношение к подциклам.
Мое понимание «цикла» заключается в том, что существует и должно быть только ОДИН «цикл» на страницу/публикацию, и что цикл отвечает за повторение содержимого этой страницы/записи/архива.
В частности, the_post() будет заполнять ряд глобальных переменных соответствующими данными, извлеченными из текущей позиции запроса в основном цикле.
Я также полагаю, что понимаю, что всякий раз, когда создается подцикл (скажем, вы хотите получить список всех дочерних сообщений каждого сообщения, указанного в архиве категорий), вы должны использовать новый экземпляр объекта WP_Query, например: $subQuery = новый WP_Query($args);
Где я сталкиваюсь с путаницей с документами Кодекса, так это в документации Wp_Query, в частности $subQuery->have_posts() и $subQuery->the_post().
В документации указано «использование в цикле» для обоих этих методов, что подразумевает (для меня), что они манипулируют глобальными переменными, которые могут повлиять на (внешний) цикл. Так ли это? Или безопасно использовать $subQuery->have_posts() (т.е. только для чтения)? А как насчет ->the_post()? Влияет ли это на глобальные переменные The Loop?
Какова наилучшая практика для повторения элементов вложенного подцикла, который не будет мешать циклу?
Сначала посмотрите , когда следует использовать WP_Query, query_posts() и get_posts()?
Да, это обычно называют «основным циклом». Но «цикл» в целом может относиться к повторению любого набора сообщений.
Да, это просто способ проверить, есть ли в цикле сообщения, которые еще не были итерированы.
Да, это так. После циклов, которые используют
the_post()
(функцию или метод), вам нужно вызватьwp_reset_postdata()
(или более глобальноwp_reset_query()
, если вы возились с основным циклом), чтобы очистить глобальные переменные.Это зависит от того, нужно ли вам использовать теги шаблонов, основанные на global
$post
, поэтому существует несколько подходов. Вы можете перебирать новыйWP_Query
объект и затем очищать его или просто извлекать массивget_posts()
и что-то с ним делать.Спасибо за быстрый ответ и за подробное рассмотрение каждого моего вопроса. Поскольку я имею дело с вложенными циклами в основном цикле, я бы предпочел подход, который не затрагивает глобальные переменные основного цикла. $subQuery->have_posts() кажется безопасным. Но как IA) получить доступ к данным для этой записи сообщения, не используя the_post() и не влияя на основные глобальные переменные, и B) как мне увеличить счетчик сообщений моего подзапроса и перейти к следующему сообщению, снова без использования the_post или next_post, которые, кажется, влияют глобальные?
@Tom Auger (а) использовать поля объекта сообщения или функции, которые возвращают данные для идентификатора переданного сообщения (б) $subQuery->next_post(), я думаю, и он также должен возвращать вам текущий объект сообщения для использования
Спасибо за ваш ответ! для A), как лучше всего получить доступ к объекту сообщения? для B), я не уверен, что next_post() безопасен. Взгляните на документы из Кодекса: next_post(): (для использования в цикле) Перейти к следующему сообщению в $posts. Увеличьте $current_post и установите $post. Обратите внимание, как он заполняет глобальную переменную $post?
@Tom Auger (a), как указано выше, я думаю
->next_post()
, что среди прочего он должен вернуть вам объект публикации (b) увеличить $current_post и установить $post, это относится к внутренним полям объекта, а не к глобальным переменным, см. источникВы да мужчина (женщина?) Спасибо, что придерживаетесь этого. Я обновил документацию Кодекса, чтобы отразить эти нюансы. Листинг исходного кода был чрезвычайно полезен, чтобы понять, что именно происходит за кулисами.