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から、より新しいバージョンのための同じ質問を持っている:
「バージョン4.1以降では、複雑なクエリを構築するためにmeta_query句をネストすることができます。」
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
フィルタも使用できます。
その間、これは可能です、例と説明が付いているドキュメンテーションを見てください:
https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
そして別の例 https://wordpress.org/support/topic/wp_query-with-multiple-meta_query/#post-9410992
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => '_price',
'value' => 1,
'compare' => '>=',
'type' => 'DECIMAL',
),
array(
'key' => '_price',
'value' <= 3000,
'compare' => '<=',
'type' => 'DECIMAL',
),
),
array(
'relation' => 'AND',
array(
'key' => '_price',
'value' => 3001,
'compare' => '>=',
'type' => 'DECIMAL',
),
array(
'key' => '_price',
'value' <= 6000,
'compare' => '<=',
'type' => 'DECIMAL',
),
)
),