問題描述

$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 將主查詢對象設置為當前的自定義查詢 beign 運行。這會打破主查詢對象的完整性,這會給您錯誤的數據,所以依賴於主查詢對象的任何東西都會因為錯誤的數據而被破壞。

一種解決這個問題的方法是創建另一個全局來存儲 2.0.0 版中引入的主查詢對象 $GLOBALS['wp_the_query']。這個新的全局保存主查詢對象和 $GLOBALS['wp_query']只是一個副本。通過 wp_reset_query(),我們現在可以將 $GLOBALS['wp_query']重新設置為原始的主查詢對象,以恢復其完整性。

但這不是一個完美的世界,而 query_posts 本身就是魔鬼。雖然數以千計的警告,人們仍然使用 query_posts 。除了打破主查詢,它重新運行主查詢,使其與使用 WP_Query 的常規自定義查詢一樣慢。完成後,許多人也不會用 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 正在做的完全相同

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。