wp_reset_postdata() или wp_reset_query() после пользовательского цикла?
Чтение материалов о wp_reset_postdata
и wp_reset_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 ошибается?

Разница между ними заключается в следующем:
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()
, а в том, что вам никогда не должно понадобиться это делать!

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

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

Нужно ли сбрасывать запрос, если я перебираю его в цикле 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()

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