2013-03-06 107 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

相關問題