$ GLOBALS ['wp_the_query'] проти глобального $ wp_query


16

У чому різниця між $GLOBALS['wp_the_query']і global $wp_query?

Навіщо віддавати перевагу одному над іншим?


2
Я б сказав global $wp_queryпросто відповісти на ваше запитання одним рядком!
Суміт

Яка різниця?
Натан Пауелл

Відповіді:


27

Ви пропустили один, $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роблять


1
query_posts () зміни global $wp_query. global $wp_the_queryмістить посилання на головний запит
Еван Маттсон

Мій коментар не розглядався як виправлення, тому вибачтесь, якщо це було. Я просто підводив підсумки (TL; DR, якщо ви хочете), вказуючи, що, на мою думку, є одним із найбільш значущих аспектів $wp_the_query, що стосується WP_Query::is_main_query()методу, про який не згадувалося: D
Еван Маттсон

@EvanMattson Вибачте, я неправильно зрозумів ваш перший коментар ;-). Так, is_main_query()яка є обгорткою, для WP_Query::is_main_query()якої перевіряє поточний об’єкт запиту на основний об'єкт запиту, збережений у $GLOBALS['wp_the_query']. Це досить важливо, коли ви виконуєте pre_get_postsдії та просто хочете націлити на основний запит ;-)
Пітер Гузен

Досить добре виконана відповідь! @EvanMattson Це мала бути редакція .
кайзер

Чи можете ви включити згадку про is_main_queryфункцію у розділі * ВАЖЛИВО ЗРІШЕННЯ? Я використовував pre_get_postsсьогодні, і вважаю, що використовувати цю функцію надзвичайно корисно з моменту перегляду $wp_query.
Натан Пауелл

2

В основному одне є копією іншого. Перевірте wp-settings.phpрядки 292-305:

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

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

2

Глобальне ключове слово імпортує змінну в локальну область, в той час як $ 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']


Надішліть, будь ласка, редагування, оскільки це насправді не є відповіддю на початкове запитання. Просто FYI $GLOBALS['foo']дозволяє перевизначення або змінну величину , а також. Тож це трохи більше, ніж ви тут описуєте.
кайзер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.