tomauger
  • 0
Эксперт

Подциклы/вложенные циклы: лучшие практики

  • 0

Я пытаюсь разобраться в трясине документации WP, и мне просто нужен кто-то, чтобы прояснить использование термина «Цикл» и его отношение к подциклам.

Мое понимание «цикла» заключается в том, что существует и должно быть только ОДИН «цикл» на страницу/публикацию, и что цикл отвечает за повторение содержимого этой страницы/записи/архива.

В частности, the_post() будет заполнять ряд глобальных переменных соответствующими данными, извлеченными из текущей позиции запроса в основном цикле.

Я также полагаю, что понимаю, что всякий раз, когда создается подцикл (скажем, вы хотите получить список всех дочерних сообщений каждого сообщения, указанного в архиве категорий), вы должны использовать новый экземпляр объекта WP_Query, например: $subQuery = новый WP_Query($args);

Где я сталкиваюсь с путаницей с документами Кодекса, так это в документации Wp_Query, в частности $subQuery->have_posts() и $subQuery->the_post().

В документации указано «использование в цикле» для обоих этих методов, что подразумевает (для меня), что они манипулируют глобальными переменными, которые могут повлиять на (внешний) цикл. Так ли это? Или безопасно использовать $subQuery->have_posts() (т.е. только для чтения)? А как насчет ->the_post()? Влияет ли это на глобальные переменные The Loop?

Какова наилучшая практика для повторения элементов вложенного подцикла, который не будет мешать циклу?

Share
  1. Сначала посмотрите , когда следует использовать WP_Query, query_posts() и get_posts()?

    Мое понимание «цикла» заключается в том, что существует и должно быть только ОДИН «цикл» на страницу/публикацию, и что цикл отвечает за повторение содержимого этой страницы/записи/архива.

    Да, это обычно называют «основным циклом». Но «цикл» в целом может относиться к повторению любого набора сообщений.

    Или безопасно использовать $subQuery->have_posts() (т.е. только для чтения)?

    Да, это просто способ проверить, есть ли в цикле сообщения, которые еще не были итерированы.

    А как насчет ->the_post()? Влияет ли это на глобальные переменные The Loop?

    Да, это так. После циклов, которые используют the_post() (функцию или метод), вам нужно вызвать wp_reset_postdata() (или более глобально wp_reset_query(), если вы возились с основным циклом), чтобы очистить глобальные переменные.

    Какова наилучшая практика для повторения элементов вложенного подцикла, который не будет мешать циклу?

    Это зависит от того, нужно ли вам использовать теги шаблонов, основанные на global $post, поэтому существует несколько подходов. Вы можете перебирать новый WP_Query объект и затем очищать его или просто извлекать массив get_posts() и что-то с ним делать.

    • 0
    • Спасибо за быстрый ответ и за подробное рассмотрение каждого моего вопроса. Поскольку я имею дело с вложенными циклами в основном цикле, я бы предпочел подход, который не затрагивает глобальные переменные основного цикла. $subQuery->have_posts() кажется безопасным. Но как IA) получить доступ к данным для этой записи сообщения, не используя the_post() и не влияя на основные глобальные переменные, и B) как мне увеличить счетчик сообщений моего подзапроса и перейти к следующему сообщению, снова без использования the_post или next_post, которые, кажется, влияют глобальные?

      • 0
    • @Tom Auger (а) использовать поля объекта сообщения или функции, которые возвращают данные для идентификатора переданного сообщения (б) $subQuery->next_post(), я думаю, и он также должен возвращать вам текущий объект сообщения для использования

      • 0
    • Спасибо за ваш ответ! для A), как лучше всего получить доступ к объекту сообщения? для B), я не уверен, что next_post() безопасен. Взгляните на документы из Кодекса: next_post(): (для использования в цикле) Перейти к следующему сообщению в $posts. Увеличьте $current_post и установите $post. Обратите внимание, как он заполняет глобальную переменную $post?

      • 0
    • @Tom Auger (a), как указано выше, я думаю ->next_post(), что среди прочего он должен вернуть вам объект публикации (b) увеличить $current_post и установить $post, это относится к внутренним полям объекта, а не к глобальным переменным, см. источник

      • 0
    • Вы да мужчина (женщина?) Спасибо, что придерживаетесь этого. Я обновил документацию Кодекса, чтобы отразить эти нюансы. Листинг исходного кода был чрезвычайно полезен, чтобы понять, что именно происходит за кулисами.

      • 0

Оставить ответ

You must login to add an answer.