2013-09-23 69 views
0

有沒有辦法讓meta_query與子關係?我不希望一個relation適用於所有查詢的數組。與子關係的Wordpress查詢

我想這一點,但無濟於事:

'meta_query' => array(
    array(
     'key' => 'event_type', 
     'value' => 'session', 
     'compare' => 'LIKE' 
    ), 
    array(
     'relation' => 'OR', 
     array(
      'key' => 'event_video', 
      'value' => '0', 
      'compare' => '>' 
     ), 
     array(
      'key' => 'event_summary', 
      'value' => '', 
      'compare' => '!=' 
     ) 
    ), 
    array(
     'key' => 'event_date_single', 
     'value' => '', 
     'compare' => 'LIKE' 
    ), 
    array(
     'key' => 'event_start_time', 
     'value' => '', 
     'compare' => 'LIKE' 
    ) 
) 

所以'relation' => 'OR'只能event_videoevent_summary之間適用。其他一切都是彼此獨立的。這可能以某種方式嗎?

感謝

回答

1

看起來這可能是一個meta_query限制。 WP Codex表明你可以使用關係的Meta查詢,但據我看到的限制是你只能使用一種關係的整個meta_query

這意味着你可以有一個完整的OR或全AND(默認)meta_query參數之間的關係,但你永遠不能擁有他們兩個結合起來,這是你想要什麼。

因爲當我在WP Codex面對它時我並不高興,所以我通過手動搜索代碼深入瞭解了這個問題。所以我發現WP_Query調用WP_Meta_Query來解析meta_query參數。這是WP_Meta_Query的類的構造函數(你可以在WP 3.6的線643發現它在wp-includes/meta.php):

/** 
* Constructor 
* 
* @param array $meta_query (optional) A meta query 
*/ 
function __construct($meta_query = false) { 
    if (!$meta_query) 
     return; 

    if (isset($meta_query['relation']) && strtoupper($meta_query['relation']) == 'OR') { 
     $this->relation = 'OR'; 
    } else { 
     $this->relation = 'AND'; 
    } 

    $this->queries = array(); 

    foreach ($meta_query as $key => $query) { 
     if (! is_array($query)) 
      continue; 

     $this->queries[] = $query; 
    } 
} 

長話短說,第二if表明,該類只會工作,要麼有ORAND關係,但是從來沒有兩個他們合併

因此,不幸的是,似乎無法實現您正在嘗試做的事情(至少在WP 3.6之前)。我猜你最好的辦法是拆分主要查詢,首先執行具體的Meta Queries,然後將結果(返回metas)應用到主查詢。

我知道這不是一個解決方案,而是一個答案。不過,我希望這可以幫助你找到解決這個問題的辦法。

+0

感謝您對此進行更多的瞭解,並提供了一個很好的解釋!至少在目前這是不可能的,這是不幸的。希望我可以一起鞭策一番,以達到預期的效果。 – scferg5

+0

@ scferg5好嗎!我想知道你在解決這個問題時是如何通過的,如果你想分享的話! – mathielo