wordpress 中 wp_query 和 wp_the_query 有什么区别

简单的可以这么说, 如果你没有使用 query_posts 那么他们两个是一样的。 wp_query 是 wp_the_query 的一个副本。

测试代码

echo "###### \$wp_query->query ##############" .PHP_EOL;
var_dump($wp_query->query);
echo "###### \$wp_the_query->query ##########" .PHP_EOL;
var_dump($wp_the_query->query);
echo "#####################################" .PHP_EOL;
echo "###### 执行 query_posts  ############" .PHP_EOL;
echo "#####################################" .PHP_EOL;

$args = array(
  'post_type'=>'product',
  'order'=>'DESC'
);

// global $wp_query;
query_posts($args);

echo "###### \$wp_query->query ##############" .PHP_EOL;
var_dump($wp_query->query);
echo "###### \$wp_the_query->query ##########" .PHP_EOL;
var_dump($wp_the_query->query);


echo "###### \$wp_query->query ##############" .PHP_EOL;
echo "###### 执行 wp_reset_query  ##########" .PHP_EOL;
echo "#####################################" .PHP_EOL;
wp_reset_query();


echo "#####################################" .PHP_EOL;
var_dump($wp_query->query);
echo "###### \$wp_the_query->query ##########" .PHP_EOL;
var_dump($wp_the_query->query);

输出

###### $wp_query->query ##############
array(0) {
}
###### $wp_the_query->query ##########
array(0) {
}
#####################################
###### 执行 query_posts  ############
#####################################
###### $wp_query->query ##############
array(2) {
  ["post_type"]=>
  string(7) "product"
  ["order"]=>
  string(4) "DESC"
}
###### $wp_the_query->query ##########
array(0) {
}
###### $wp_query->query ##############
###### 执行 wp_reset_query  ##########
#####################################
#####################################
array(0) {
}
###### $wp_the_query->query ##########
array(0) {
}

可以看到 $wp_the_query 是没有变化的, 使用了 query_posts 后 $wp_query 就发生了变化。使用 wp_reset_query 后 $ wp_query 内容又恢复为执行 query_posts 之前的内容。

这也很好的说明了,执行 query_posts 后要执行 wp_reset_query