問題描述
$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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。