$ GLOBALS vs global $ wp_query

В чем разница между $GLOBALS['wp_the_query'] и global $wp_query ?

Почему они предпочитают друг друга?

Solutions Collecting From Web of "$ GLOBALS vs global $ wp_query"

Вы пропустили один, $GLOBALS['wp_query'] . Для всех целей $GLOBALS['wp_query'] === $wp_query . $GLOBALS['wp_query'] , однако, лучше для читаемости и должен использоваться вместо $wp_query , НО, который остается личным предпочтением

Теперь, в идеальном мире, где единороги правят миром, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query . По умолчанию это должно быть правдой. Если мы посмотрим, где установлены эти глобальные переменные ( wp-settings.php ), вы увидите, что основной объект запроса хранится в $GLOBALS['wp_the_query'] а $GLOBALS['wp_query'] – всего лишь дубликат копии $GLOBALS['wp_the_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']; 

Причина этого в том, что WordPress увидела появление query_posts в версии 1.5.

 function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); } 

Как вы можете видеть, query_posts устанавливает основной объект запроса в текущий пользовательский запрос beign run. Это нарушает целостность основного объекта запроса, что дает неверные данные, поэтому все, что зависит от основного объекта запроса, прерывается из-за неправильных данных.

Способом борьбы с этим было создание другого глобального хранилища основного объекта запроса, $GLOBALS['wp_the_query'] который был введен в версии 2.0.0. Этот новый глобальный объект содержит основной объект запроса и $GLOBALS['wp_query'] только копию. Через wp_reset_query() мы теперь можем вернуть $GLOBALS['wp_query'] обратно в исходный основной объект запроса, чтобы восстановить его целостность.

Но это не идеальный мир, а query_posts – сам дьявол. Хотя тысячи предупреждений, люди все еще используют query_posts . Помимо разрыва основного запроса, он повторно запускает основной запрос, делая его намного медленнее, чем обычный пользовательский запрос с WP_Query . Многие люди также не сбрасывают запрос query_posts с помощью wp_reset_query() когда это делается, что делает query_posts еще более злым.

Поскольку мы ничего не можем с этим поделать и не можем остановить плагины и темы из-за использования query_posts и мы никогда не узнаем, был query_posts запрос query_posts сброшен с помощью wp_reset_query() , нам нужна более надежная копия основного объекта запроса, который, как мы знаем, даст нам 99.99999% надежных, правильных данных. Вот где $GLOBALS['wp_the_query'] полезно, поскольку ни один связанный с WordPress код не может изменить его значение ( за исключением фильтров и действий внутри самого WP_Query ).

Быстрое доказательство, выполните следующие

 var_dump( $GLOBALS['wp_the_query'] ); var_dump( $GLOBALS['wp_query'] ); query_posts( 's=crap' ); var_dump( $GLOBALS['wp_the_query'] ); var_dump( $GLOBALS['wp_query'] ); 

и проверьте результаты. $GLOBALS['wp_the_query'] не изменился, а $GLOBALS['wp_query'] . Так что более надежно?

Заключительное примечание, $GLOBALS['wp_the_query'] НЕ является заменой для wp_reset_query() . wp_reset_query() всегда следует использовать с query_posts , и query_posts никогда не должны использоваться.

ЗАКЛЮЧИТЬ

Если вам нужен надежный код, который почти всегда никогда не сбой, используйте $GLOBALS['wp_the_query'] , если вы доверяете и верите плагинам и код темы и полагаете, что никто не использует query_posts или не использует его правильно, используйте $GLOBALS['wp_query'] или $wp_query

ВАЖНОЕ ИЗМЕНЕНИЕ

Отвечая на вопросы на этом сайте уже пару лет, я увидел, что многие пользователи используют $wp_query в качестве локальной переменной, которая, в свою очередь, также разбивает основной объект запроса. Это еще больше увеличивает уязвимость $wp_query .

Например, некоторые люди к этому

 $wp_query = new WP_Query( $args ); 

который по сути точно совпадает с тем, что делают query_posts

В основном одна копия другой. Проверьте wp-settings.php , строки 292-305:

 $GLOBALS['wp_the_query'] = new WP_Query(); $GLOBALS['wp_query'] = $GLOBALS['wp_the_query']; 

Глобальное ключевое слово импортирует переменную в локальную область, а $ GLOBALS просто предоставляет вам доступ к переменной.

Чтобы разработать, если вы используете global $wp_the_query; вы можете использовать $wp_the_query внутри локальной области без повторного использования слова global. Таким образом, в основном global $wp_the_query можно сравнить с $wp_the_query = $GLOBALS['wp_the_query']

РЕДАКТИРОВАТЬ

Я неправильно читаю wp_query для wp_the_query, поэтому мой ответ не является полным ответом на вопрос, но по-прежнему содержит общую информацию о различии между global $variable $GLOBALS['variable'] и $GLOBALS['variable']