$GLOBALS[‘wp_the_Query’]与全局$wp_Query

时间:2016-03-14 作者:Nathan Powell

两者的区别是什么$GLOBALS[\'wp_the_query\']global $wp_query?

为什么喜欢一个而不是另一个?

3 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

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

SO网友:Jeffrey von Grumbkow

global关键字将变量导入本地范围,而$GLOBALS只授予您对变量的访问权限。

如果您使用global $wp_the_query;您可以使用$wp_the_query 在局部范围内,而不再次使用全局这个词。所以基本上global $wp_the_query 可与相比$wp_the_query = $GLOBALS[\'wp_the_query\']

EDIT

我错误地阅读了wp\\U查询中的wp\\U查询,因此我的答案不是问题的完整答案,但仍然提供了有关两者之间差异的一般信息global $variable$GLOBALS[\'variable\']

SO网友:denis.stoyanov

基本上一个是另一个的副本。