Mehrere Metaschlüsselwerte abfragen?

22

Abfragen mehrerer Metaschlüsselwerte mit demselben Schlüssel

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

nächster Code

<?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; ?>
steen
quelle

Antworten:

31

Ich habe das Gefühl, dass hier eine UND / ODER-Verwechslung stattfindet.

Die Abfragen im OP geben nur Posts zurück, die sowohl key1 = 'value1' als auch key2 = 'value2' haben. Die meisten WP-Plugins (von denen ich sowieso weiß) speichern nicht mehrere Werte in Postmeta für denselben Beitrag mit demselben Schlüssel.

Wenn Sie wirklich eine ODER-Verknüpfung wünschen (Sie möchten die Posts mit key1 = 'value1' sowie die Posts mit key1 = 'value2' erhalten), lesen Sie die Antwort von @ WhiskerSandwich unter Verwendung von 'IN' und einer Reihe von Werten für den Wertparameter.

Alternativ können Sie einen relationParameter für "meta_query" angeben:

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

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

Beachten Sie, dass die Verwendung von OR als Relation für mehrere Metaabfragen mit demselben Schlüssel das funktionale Äquivalent zu using INund einem Array von Werten für eine einzelne ist.

Boone-Schluchten
quelle
Danke dafür, Boone. Ich wusste nicht, dass der Parameter "Relation" existiert. Hat mir geholfen.
MathSmath
Dies funktioniert, wenn Sie nur einen Schlüssel zum Durchsuchen haben. Wenn Sie zwei oder mehr haben, müssen Sie diese möglicherweise mit 'AND' im Beziehungsparameter kombinieren. In diesem Fall ist die Antwort von @ WhiskerSandwich die bessere Anpassung.
SinisterBeard
14

Ich hatte das gleiche Problem, bei dem das Übergeben mehrerer Arrays für denselben Schlüssel nicht funktionierte. Verwenden Sie stattdessen nur ein Array, setzen Sie 'value' auf ein Array von Werten und 'compare' auf IN:

<?php

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

?>
WhiskerSandwich
quelle
1

Sie müssen die Postmeta-Tabelle für den zweiten Wert aliasen:

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

Dies können Sie seit 3.1 auch mit einem meta_query:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
Milo
quelle
Hallo Milo, danke für die Antwort. Die SQL gibt keinen Wert zurück. Und das Array gibt auch keinen Wert zurück, es sei denn, ich entferne den zweiten Schlüssel und den zweiten Wert aus dem Array. Also ist das abgehört?
Steen
@steen - Ich bin mir nicht sicher, was dein Problem ist. Ich habe beide Methoden getestet und sie funktionieren in meiner Installation von 3.3.1. Ist Ihr Schlüssel buchstäblich "key1" und die Werte "value1" und "value2"? Sehen Sie nichts, wenn Sie print_r( $the_query );unmittelbar nach der Abfrage?
Milo
0

Key ist key1 und die Werte 'value1' und 'value2' haben es in einer Neuinstallation mit 21 sowohl mit Text als auch mit Zahlen versucht. print_r ($ the_query); Die Werksausgabe sieht normal aus. Auch versucht, key1 und key2 funktioniert auch nicht. Es funktioniert, sobald ich es auf ein Array beschränke. Mit verschiedenen Browsern überprüft.

Dies funktioniert jedoch.

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

 ?>
steen
quelle