Как reset_postdata восстанавливает пост основного цикла запроса?

Как работает reset_postdata ? Документы говорят:

восстановить глобальную переменную $ post основного цикла запроса после вторичного цикла запросов с использованием нового WP_Query

Но в классе он берет «текущую» пост текущего экземпляра WP_Query и устанавливает его как глобальную $post . Итак, как он восстанавливает пост основного цикла запроса?

Класс WP_Query .

Solutions Collecting From Web of "Как reset_postdata восстанавливает пост основного цикла запроса?"

WP_Query::reset_postdata() устанавливает глобальную переменную post ( $GLOBALS['post'] === $post ) в текущую запись в цикле текущего экземпляра WP_Query .

 public function reset_postdata() { if ( ! empty( $this->post ) ) { $GLOBALS['post'] = $this->post; $this->setup_postdata( $this->post ); } } 

Это означает, что если вы запустили пользовательский запрос на странице, $post будет удерживать последнее сообщение в цикле этого пользовательского запроса. Чтобы вы могли проверить себя, добавив

 ?><pre><?php var_dump($post); ?></pre><?php 

непосредственно после цикла вашего пользовательского запроса.

То же самое верно для основного запроса после цикла, $post будет содержать последний пост основного запроса и первый пост в цикле перед циклом.

Вот простой тест для проверки $post global. Вы можете добавить это в свой файл функций и загрузить любую страницу на своем сайте

 add_action( 'wp_head', function() { global $post; ?><pre><?php var_dump($post->ID); ?></pre><?php }): add_action( 'wp_footer', function() { global $post; ?><pre><?php var_dump($post->ID); ?></pre><?php $q = new WP_Query( 'posts_per_page=3' ); while ( $q->have_posts() ) { $q->the_post(); ?><pre><?php var_dump($post->ID); ?></pre><?php the_title(); } ?><pre><?php var_dump($post->ID); ?></pre><?php wp_reset_postdata(); ?><pre><?php var_dump($post->ID); ?></pre><?php }); 

Итак, как он восстанавливает пост основного цикла запроса?

Это делается путем вызова wp_reset_postdata() который сбрасывает глобальную $post текущей записи в цикле основного запроса. Обычно это первый из последних сообщений, если вы добавляете свой пользовательский запрос до или после основного цикла запроса.

Давайте посмотрим, как wp_reset_postdata() делает wp_reset_postdata()

 function wp_reset_postdata() { global $wp_query; if ( isset( $wp_query ) ) { $wp_query->reset_postdata(); } } 

Как вы можете видеть, wp_reset_postdata() является просто оболочкой для WP_Query::reset_postdata() . Важная часть здесь заключается в том, что это оболочка для метода объекта основного запроса, $wp_query->reset_postdata(); ,

Помните, что основной запрос также использует WP_Query . Вот как устанавливается основной объект запроса

 /** * WordPress Query object * @global WP_Query $wp_the_query * @since 2.0.0 */ $GLOBALS['wp_the_query'] = new WP_Query(); /** * Holds the reference to @see $wp_the_query * Use this global for WordPress queries * @global WP_Query $wp_query * @since 1.5.0 */ $GLOBALS['wp_query'] = $GLOBALS['wp_the_query']; 

Итак, что wp_reset_postdata() , он занимает текущую должность в основном объекте запроса и устанавливает это как $post global, и именно так WP_Query::reset_postdata() устанавливает $post в текущую должность основного запроса