it-swarm.com.de

Mehrere Metaschlüsselwerte abfragen?

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

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

Die Abfragen im OP geben nur Posts zurück, die beide key1 = 'value1' UND 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 ein OR möchten (Sie möchten die Posts mit key1 = 'value1' sowie die Posts mit key1 = 'value2' erhalten), lesen Sie die Antwort von @ WhiskerSandwich mit 'IN 'und ein Array von Werten für den Werteparameter.

Alternativ können Sie einen relation-Parameter 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 zur Verwendung von IN und einem Array von Werten für eine einzelne ist.

31
Boone Gorges

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

?>
14
WhiskerSandwich

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

Sie können dies seit 3.1 auch mit einem meta_query tun:

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

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

 ?>
0
steen