Intereting Posts
Отключить сохранение сведений о комментариях (имя, адрес электронной почты) в cookie? Зачем нужно четыре попытки сбросить пароль, чтобы наконец получить электронное письмо? Отключить wpautop, оставить разрывы строк Создание пользовательской роли нескольких пользователей для снижения возможностей Лучшая практика для отображения категоризированных сообщений на главной странице Определение того, где плагины используются в вашей программе WordPress как можно показать с поста пользовательского типа сообщения таксономия / условия? Htaccess для Wordpess, установленного на одном субдомене get_page_by_title () не получает сообщение Загрузка аватара из интерфейса Разделить содержимое сообщения на отдельные div для каждых 500 символов (или любых других символов) Определение того, произойдет ли автоматическое обновление? Получение заголовков «Следующая» и «Предыдущая запись» на боковой панели? Изменить get_permalink с помощью определенного фильтра Удалить меню настройки фона и заголовка из меню Appearance без CSS или JS

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

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

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

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

Класс WP_Query .

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 в текущую должность основного запроса