什么时候初始化$ wp_query以及如何覆盖它?

时间:2013-03-06 14:36:19

标签: wordpress

我正在尝试使用WP_Query对象编写新的查询函数。

我创建了一个新的模板文件并添加了以下内容:

        $query_args = array(
            'post_type' => 'page',
            'post_parent=41',
        );

        // The Featured Posts query.
        $results = new WP_Query($query_args);

但无论我使用什么参数,查询都不会改变。看起来好像查询已经初始化,并且创建新的WP_Query对现有查询没有任何影响。

我的代码之前调用的唯一wordpress函数是get_header(),其中不包含对WP_Queryquery_posts的任何调用。

我将以下行找出实际的sql查询:

echo $GLOBALS['wp_query']->request;

实际的sql查询是:

SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND (wp_posts.ID = '14') AND wp_posts.post_type = 'page' ORDER BY wp_posts.post_date DESC

当我更改$query_args时,此查询不会更改。

我想知道全局变量$wp_query什么时候被初始化,我应该怎么做才能使用我自己的查询?

2 个答案:

答案 0 :(得分:16)

您正在创建 WP_Query对象并将其保存到$results。这就是查询结果的位置,而不是$GLOBALS['wp_query']。当然它不会覆盖$wp_query。他们是不同的东西。请改为var_dump($results)

您可以通过创建新的$wp_query对象来覆盖WP_Query,如下所示:$wp_query = new WP_Query($query_args);。但那效率不高。只需要一个查询就可以运行两个查询。更好的方法是挂钩pre_get_posts。类似的东西:

function alter_query_so_15250127($qry) {
   if ( $qry->is_main_query() && is_page('featured-posts-page') ) {
     $qry->set('post_type','page');
     $qry->set('post_parent',41);
   }
}
add_action('pre_get_posts','alter_query_so_15250127');

if条件非常重要。您需要使用该行来确保过滤器仅在您要触发的页面上触发。你的问题没有足够的细节让我弄清楚确切的条件。

答案 1 :(得分:8)