Когда следует использовать запрос wp reset postdata против запроса wp reset?


Похоже, что половина учебных пособий в Кодексе использует wp_reset_postdata(), а половина - wp_reset_query(). В чем дело? Может быть, использовать их обоих? А как насчет rewind_posts()? Я прошу ответа , основанного на фактах, а не на мнениях.

Author: Narek Zakarian, 2017-11-29

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();

 6
Author: Jacob Peattie, 2017-11-29 12:22:45