複数のメタキー値をクエリしますか?


22

同じキーで複数のメタキー値を照会する方法

$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; ?>

回答:


31

ここでAND / ORの混乱が起こっているように感じます。

OPのクエリは、key1 = 'value1' AND key2 = 'value2'の両方を持つ投稿のみを返します。ほとんどのWPプラグイン(とにかく知っている)は、同じキーを使用して、同じ投稿に対して複数の値をpostmetaに保存しません。

必要なものが本当にORである場合(key1 = 'value1'の投稿とkey1 = 'value2'の投稿を取得する場合)、 'IN'および値の配列を使用して@WhiskerSandwichの回答を参照してください。値パラメータ用。

または、relation「meta_query」にパラメーターを指定できます。

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),

        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);

同じキーを使用する複数のメタクエリのリレーションとしてORを使用するINことは、単一のキーを使用して値の配列を使用することと機能的に同等であることに注意してください。


これをありがとう、ブーン。「関係」パラメータが存在することを知りませんでした。手伝ってくれました。
MathSmath

これは、検索するキーが1つしかない場合に機能します。2つ以上ある場合は、 'AND'を使用して関係パラメーターでそれらを結合する必要がある場合があります。その場合、以下の@WhiskerSandwichの答えがより適しています。
SinisterBeard

14

同じキーに複数の配列を渡すことが機能しないという同じ問題がありました。代わりに、1つの配列を使用し、「値」を値の配列に設定し、「比較」をINに設定します。

<?php

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => array('value1', 'value2'),
            'compare' => 'IN'
        ),
    )
);
$query = new WP_Query( $args );

?>

1

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 );

こんにちはミロは答えてくれてありがとう。SQLは値を返しません。そして、配列から2番目のキーと値を削除しない限り、配列も値を返しません。これはバグですか?
スティーン

@steen-あなたの問題が何なのかわかりません。両方の方法をテストし、3.3.1のインストールで機能しています。キーは文字通り「key1」で、値は「value1」と「value2」ですか?print_r( $the_query );クエリの直後に何も表示されませんか?
ミロ

0

キーはkey1で、値 'value1'および 'value2'は、21の新しいインストールでテキストと数値の両方を試しました。print_r($ the_query); ワークス出力は正常に見えます。また、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 );

 ?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.