同じキーを持つ複数のメタキー値を問い合わせる方法
$querystr = "
SELECT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->postmeta.meta_key = 'key1'
AND $wpdb->postmeta.meta_value = 'value1'
// why doesn't this work?
AND $wpdb->postmeta.meta_value = 'value2'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'post'
ORDER BY $wpdb->posts.post_date DESC
";
次のコード
<?php
$args = array(
'meta_query' => array(
array(
'key' => 'key1',
'value' => 'value1',
'compare' => '='
),
// this array results in no return for both arrays
array(
'key' => 'key1',
'value' => 'value2',
'compare' => '='
)
)
);
$the_query = new WP_Query( $args );
?>
<?php /* Start the Loop */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
ここでAND/OR混乱が起こっているような気がします。
OPのクエリは、 both key1 = 'value1' AND key2 = 'value2'の投稿のみを返します。ほとんどのWPプラグイン(とにかく私が知っている)は、同じキーを使って同じ投稿に対して複数の値をpostmetaに保存しません。
欲しいものが本当にORである場合(key1 = 'value1'の投稿とkey1 = 'value2'の投稿を取得したい場合)、@ WhiskerSandwichの答えを 'INを使ってご覧ください'およびvalueパラメーターの値の配列。
あるいは、relation
パラメータを `meta_query 'に与えることもできます。
$args = array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'key1',
'value' => 'value1',
'compare' => '='
),
array(
'key' => 'key1',
'value' => 'value2',
'compare' => '='
)
)
);
同じキーを使用する複数のメタクエリの関係としてORを使用することは、IN
と単一の値に値の配列を使用することと機能的に同等です。
同じキーに複数の配列を渡してもうまくいかないという同じ問題がありました。代わりに、1つの配列を使用し、 'value'を値の配列に設定し、 'compare'をINに設定してください。
<?php
$args = array(
'meta_query' => array(
array(
'key' => 'key1',
'value' => array('value1', 'value2'),
'compare' => 'IN'
),
)
);
$query = new WP_Query( $args );
?>
2番目の値にpostmetaテーブルをエイリアスする必要があります。
$querystr = "
SELECT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->postmeta.meta_key = 'key1'
AND $wpdb->postmeta.meta_value = 'value1'
AND mt1.meta_key = 'key1'
AND mt1.meta_value = 'value2'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'post'
ORDER BY $wpdb->posts.post_date DESC
";
また、3.1から meta_query
を使ってこれを行うこともできます。
$args = array(
'meta_query' => array(
array(
'key' => 'key1',
'value' => 'value1',
'compare' => '='
),
array(
'key' => 'key1',
'value' => 'value2',
'compare' => '='
)
)
);
$query = new WP_Query( $args );
キーはkey1で、値 'value1'と 'value2'は、21との新規インストールでテキストと数値の両方を試しました。 print_r($ the_query); works出力は正常に見えます。 key1とkey2を試しても動作しません。私はそれを1つのアレイに限定するとすぐにそれは働きます。別のブラウザで確認しました。
しかしこれはうまくいきます。
<?php
$args = array(
'meta_query' => array(
array(
'key' => 'wtf',
'value' => '1',
'compare' => '>='
),
// this array results in no return for both arrays
array(
'key' => 'wtf',
'value' => '2',
'compare' => '<='
)
)
);
$the_query = new WP_Query( $args );
?>