問題描述
我很好奇 Wordpress 能否運行嵌套的 meta_query,每個都有不同的關係鍵?從 Wordpress 3.0 起,tax_query 能夠執行此功能; 我想知道這是否與 meta_query 相當。
$results = query_posts( array(
'post_type' => 'event_id',
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => 'primary_user_id',
'value' => $user_id
),
array(
'key' => 'secondary_user_id',
'value' => $user_id
)
),
array(
'key' => 'date',
'value' => array( $start_date, $end_date ),
'type' => 'DATETIME',
'compare' => 'BETWEEN'
)
)
) );
參考文獻:
最佳解決方案
問題是 Wordpress 3.0,但是為了防止有人對於更新版本有相同的問題,從 Wordpress Codex:
“Starting with version 4.1, meta_query clauses can be nested in order to construct complex queries.”
http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
所以,該查詢應該適用於當前的 Wordpress 版本。
次佳解決方案
這似乎是不可能的如果我錯了,請別人糾正我
meta_query 參數實際上將被轉換為 WP_Meta_Query 對象,而 relation 的驗證在 wp-includes/meta.php 中不會更深入,而在頂級只出現一次:
if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {
$this->relation = 'OR';
} else {
$this->relation = 'AND';
}
一個可能的解決方案是為此查詢建立自己的 JOIN 。
$query = new WP_Query( array(
...
'my_meta_query' => true,
'suppress_filters' => false
) );
add_filter( 'posts_join', 'my_meta_query_posts_join', 10, 2 );
function my_meta_query_posts_join( $join, $query ) {
if ( empty( $query->query_vars['my_meta_query'] ) )
return $join;
global $wpdb;
$new_join = "
INNER JOIN {$wpdb->postmeta} pm1 ON 1=1
AND pm1.post_id = {$wpdb->posts}.ID
AND pm1.meta_key = '_some_meta_key'
AND pm1.meta_value = 'some_value'
";
return $join . ' ' . $new_join;
}
如果您需要進一步的驗證和規則,還可以使用 posts_where 過濾器。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。