У чому різниця між $GLOBALS['wp_the_query']
і global $wp_query
?
Навіщо віддавати перевагу одному над іншим?
У чому різниця між $GLOBALS['wp_the_query']
і 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
основний об’єкт запиту задає поточний запуск користувальницького запиту. Це порушує цілісність основного об’єкта запиту, що дає вам неправильні дані, тому все, що спирається на основний об’єкт запиту, порушено через неправильні дані.
Спосіб протидії цьому полягав у створенні іншого глобального для зберігання основного об’єкта запиту, $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
запит 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_the_query
, що стосується WP_Query::is_main_query()
методу, про який не згадувалося: D
is_main_query()
яка є обгорткою, для WP_Query::is_main_query()
якої перевіряє поточний об’єкт запиту на основний об'єкт запиту, збережений у $GLOBALS['wp_the_query']
. Це досить важливо, коли ви виконуєте pre_get_posts
дії та просто хочете націлити на основний запит ;-)
is_main_query
функцію у розділі * ВАЖЛИВО ЗРІШЕННЯ? Я використовував pre_get_posts
сьогодні, і вважаю, що використовувати цю функцію надзвичайно корисно з моменту перегляду $wp_query
.
В основному одне є копією іншого. Перевірте 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']
EDIT
Я неправильно прочитав wp_query для wp_the_query, тому моя відповідь не є повною відповіддю на питання, але все ж дає загальну інформацію про різницю між global $variable
та$GLOBALS['variable']
$GLOBALS['foo']
дозволяє перевизначення або змінну величину , а також. Тож це трохи більше, ніж ви тут описуєте.
global $wp_query
просто відповісти на ваше запитання одним рядком!