У чому різниця між $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просто відповісти на ваше запитання одним рядком!