Meminta beberapa nilai kunci meta?

22

Cara kueri untuk nilai kunci meta mutiple dengan kunci yang sama

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

kode selanjutnya

<?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
sumber

Jawaban:

31

Saya merasa ada DAN / ATAU kebingungan terjadi di sini.

Kueri dalam OP hanya akan mengembalikan posting yang memiliki kedua key1 = 'value1' AND key2 = 'value2'. Kebanyakan plugin WP (yang saya tahu, toh) tidak menyimpan banyak nilai dalam postmeta, untuk posting yang sama, menggunakan kunci yang sama.

Jika apa yang Anda inginkan benar-benar OR (Anda ingin mendapatkan posting di mana key1 = 'value1', serta posting di mana key1 = 'value2'), kemudian lihat jawaban @ WhiskerSandwich, menggunakan 'IN' dan array nilai. untuk parameter nilai.

Atau, Anda dapat memberikan relationparameter ke `meta_query ':

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

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

Perhatikan bahwa menggunakan OR sebagai hubungan untuk beberapa meta kueri menggunakan kunci yang sama adalah fungsional yang setara dengan penggunaan INdan array nilai untuk satu meta .

Boone Gorges
sumber
Terima kasih untuk ini, Boone. Saya tidak tahu "hubungan" param ada. Bantu aku keluar.
MathSmath
Ini berfungsi jika Anda hanya memiliki satu kunci untuk dicari. Jika Anda memiliki dua atau lebih, Anda mungkin perlu menggunakan 'DAN' untuk menggabungkan mereka dalam parameter hubungan, dalam hal ini jawaban @ WhiskerSandwich di bawah ini lebih cocok.
SinisterBeard
14

Saya memiliki masalah yang sama ketika melewati beberapa array untuk kunci yang sama tidak berfungsi. Sebagai gantinya, cukup gunakan satu larik, atur 'nilai' ke larik nilai, dan atur 'bandingkan' ke IN:

<?php

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

?>
WhiskerSandwich
sumber
1

Anda harus alias tabel postmeta untuk nilai kedua:

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

Anda juga dapat melakukan ini sekarang sejak 3.1 dengan 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
sumber
Hai Milo terima kasih telah menjawab. SQL tidak mengembalikan nilai. Dan array tidak mengembalikan nilai juga kecuali saya menghapus kunci dan nilai 2 dari array. Jadi ini disadap?
steen
@steen - Saya tidak yakin apa masalah Anda, saya sudah menguji kedua metode dan mereka bekerja di instal saya 3.3.1. Apakah kunci Anda benar-benar 'key1' dan nilai 'value1' dan 'value2'? Apakah Anda melihat apa-apa jika Anda print_r( $the_query );segera setelah permintaan?
Milo
0

Kuncinya adalah key1 dan nilai 'value1' dan 'value2' mencobanya baik teks dan numerik dalam instalasi baru dengan dua puluh sebelas. print_r ($ the_query); output bekerja terlihat normal. Juga mencoba key1 dan key2 juga tidak berhasil. Ini berfungsi segera setelah saya batasi untuk satu array. Diperiksa dengan berbagai browser.

Namun ini berhasil.

    <?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
sumber