你错过了一个,$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\']
是NOT 替换wp_reset_query()
. wp_reset_query()
应该always 与一起使用query_posts
, 和query_posts
应该never 被使用。
总之,如果您需要几乎永远不会失败的可靠代码,请使用$GLOBALS[\'wp_the_query\']
, 如果你相信插件和主题代码,并且相信没有人使用query_posts
或者是否正确使用,请使用$GLOBALS[\'wp_query\']
或$wp_query
重要编辑几年来,我一直在这个网站上回答问题,我看到许多用户使用$wp_query
作为局部变量,这反过来也会中断主查询对象。这进一步增加了$wp_query
.
例如,有些人
$wp_query = new WP_Query( $args );
本质上与
query_posts
正在做