Когда следует использовать запрос wp reset postdata против запроса wp reset?
Похоже, что половина учебных пособий в Кодексе использует wp_reset_postdata()
, а половина - wp_reset_query()
. В чем дело? Может быть, использовать их обоих? А как насчет rewind_posts()
? Я прошу ответа , основанного на фактах, а не на мнениях.
1 answers
wp_reset_postdata()
сбрасывает значение переменной global $post
в свойство post
основного запроса, которое будет соответствовать любой записи, в которой основной запрос был последним. Вы бы сделали это, если бы использовали setup_postdata()
или $query->the_post()
в пользовательском запросе. Оба они заменяют глобальную переменную $post
, так что такие функции, как the_title()
, получают правильное название для текущей записи в цикле.
wp_reset_query()
сбрасывает основной запрос обратно к тому, каким он был при первоначальной загрузке. Единственная причина, по которой это произойдет, о которой я знаю это если вы использовали query_posts()
для его изменения. Вам ни в коем случае не следует этого делать. Эта функция также вызывает wp_reset_postdata()
внутренне, поэтому будет иметь тот же эффект.
rewind_posts()
устанавливает текущую запись в основном запросе на первую запись. Поскольку have_posts()
вызывает rewind_posts()
внутренне, как только вы пройдете мимо последнего сообщения, я не уверен, когда вам когда-нибудь понадобится это использовать. Вероятно, только в том случае, если вам когда-нибудь понадобится вернуться к началу цикла до того, как он закончится.
Поэтому в основном вы должны использовать wp_reset_postdata()
всякий раз, когда вы делаете одно из следующих действий:
Вторичный запрос:
$my_query = new WP_Query( $args );
while ( $my_query->have_posts() ) : $my_query->the_post();
the_title();
endwhile;
wp_reset_postdata();
Зацикливание get_posts()
результаты:
global $post;
$my_posts = get_posts( $args );
foreach ( $my_posts as $post ) : setup_postdata( $post );
the_title();
endforeach;
wp_reset_postdata();
Или получение одного сообщения и использование тегов шаблонов:
global $post;
$post = get_post( $id );
setup_postdata( $post );
the_title();
wp_reset_postdata();
И вы бы использовали rewind_posts()
, если бы вам когда-нибудь понадобилось перейти к началу цикла. Этот пример странный, но я не мог придумать лучшего. Это в основном, если вы хотите показать первые 3 сообщения цикла, затем перейдите к началу и покажите их все:
global $wp_query;
$started_over = false;
while ( have_posts() ) : the_post();
the_title();
if ( ! $started_over && $wp_query->current_post == 2 ) {
$started_over = true;
rewind_posts();
}
endwhile;
И вы должны в принципе, никогда не нужно wp_reset_query();