wp_reset_postdata() или wp_reset_query() после пользовательского цикла?

14 мая 2014 г., 09:35:18
Просмотры: 92.1K
Голосов: 66

Чтение материалов о wp_reset_postdata и wp_reset_query вызывает у меня путаницу. Например:

  1. Нужно ли использовать одновременно wp_reset_postdata и wp_reset_query?

  2. http://www.poststat.us/properly-reset-wordpress-query/

В указанных источниках говорится, что wp_reset_postdata() следует использовать только для "отдельных запросов". В примере 2 есть комментарий:

WP_Query( $args ) = wp_reset_postdata();

И

query_posts ( $args ) = wp_reset_query();

И действительно, вам никогда не следует использовать wp_reset_query, потому что вы не должны использовать query_posts!?

В WP Codex указано, что следует использовать wp_reset_query() после пользовательского цикла (первый пример) http://codex.wordpress.org/Function_Reference/wp_reset_query

Значит ли это, что Codex ошибается?

0
Все ответы на вопрос 1
4
106

Разница между ними заключается в следующем:

  • wp_reset_query() - гарантирует, что основной запрос был сброшен до оригинального главного запроса
  • wp_reset_postdata() - гарантирует, что глобальная переменная $post была восстановлена до текущей записи в основном запросе.

Действительно, если посмотреть исходный код, можно увидеть, что wp_reset_query() вызывает wp_reset_postdata(). Единственная разница между ними заключается в этой строке:

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

wp_reset_query()). Таким образом, wp_reset_query() необходим только в случае, если эти две глобальные переменные различаются, что происходит только при использовании query_posts() где-либо.

Когда их следует использовать?

Проще говоря:

  • wp_reset_postdata() - сразу после каждого пользовательского WP_Query()
  • wp_reset_query() - сразу после каждого цикла с использованием query_posts()

Следует ли использовать wp_reset_query

Да, но он нужен только после использования query_posts(). Как вы уже отметили, никогда не следует использовать query_posts(). Поэтому, если вы никогда не используете query_posts(), то нет необходимости вызывать wp_reset_query() (вместо wp_reset_postdata()).

Короче говоря, дело не в том, что не следует использовать wp_reset_query() вместо wp_reset_postdata(), а в том, что вам никогда не должно понадобиться это делать!

14 мая 2014 г. 09:49:16
Комментарии

То есть, если я правильно понимаю, вы говорите: Использовать только wp_reset_postdata(), а пример в кодексе некорректен? (Если делать всё правильно)

bestprogrammerintheworld bestprogrammerintheworld
14 мая 2014 г. 10:40:07

Кодекс может измениться, поэтому я избегаю абсолютных утверждений о нём, которые могут устареть. В нём есть пример цикла с WP_Query(), где используется wp_reset_query(), хотя в этом нет необходимости. Вместо этого можно использовать wp_reset_postdata(), но никакого вреда это не принесёт. Также в кодексе есть пример с query_posts(), где он использует (и должен использовать) wp_reset_query(). Но, как отмечено в кодексе, это плохой пример, и он 'не рекомендуется', поскольку query_posts() вообще не следует использовать.

Stephen Harris Stephen Harris
14 мая 2014 г. 11:08:23

Нужно ли сбрасывать запрос, если я перебираю его в цикле foreach?

Например:

$sol_args = array( 'post_type' => 'solution', 'orderby' => 'menu_order', 'order' => 'ASC', 'lang' => pll_current_language(), 'posts_per_page' => '-1', );

$solution_posts = new WP_Query($sol_args); $solution_posts = $solution_posts->get_posts();

<?php foreach ($solution_posts as $solution_post) { ?> <?php } ?>

wp_reset_postdata()

Marcuzio Developuzio Marcuzio Developuzio
9 нояб. 2022 г. 15:01:44

Я воспринял этот совет буквально и столкнулся с проблемами. В нем говорится, что нужно вызывать wp_reset_postdata() сразу после каждого пользовательского WP_Query() (выделено мной). Однако, справочник разработчика указывает, что его следует вызывать, когда:

"Вторичный цикл запроса, использующий $sec_query = new WP_Query() и $sec_query->the_post(), влияет на глобальную переменную $post."

Снова выделено мной.

Если вы не вызываете the_post(), то нет необходимости вызывать wp_reset_postdata(), и более того, это может вызвать проблемы.

Dave S Dave S
1 мая 2024 г. 19:57:16