你错过了一个,$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 正在做