2013-03-06 104 views
3

我正在尝试使用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被初始化了,我该怎么做才能使用我自己的查询呢?

回答

15

您正在创建一个新的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非常重要。您需要使用该行来确保过滤器仅在您希望触发的页面上触发。你的问题没有足够的细节来确定准确的条件。

+0

要完成这种反应。我还必须重写一些值并将它们设置为null来运行查询:'$ qry-> set('p',null); $ qry-> set('page_id',null); ' – Rufein 2015-02-03 15:20:27

相关问题