问题描述
$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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。