Birden fazla meta anahtar değeri sorgula?


22

Mutiple meta anahtar değerleri aynı anahtarla nasıl sorgulanır

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

sonraki kod

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

Yanıtlar:


31

Burada bir VE / VEYA karışıklığı olduğunu hissediyorum.

OP'deki sorgular yalnızca hem key1 = 'value1' AND hem de key2 = 'value2' olan gönderileri döndürür . Çoğu WP eklentisi (zaten bildiğim kadarıyla), aynı anahtarı kullanarak aynı yazı için postmeta'da birden fazla değer saklamıyor.

İstediğiniz şey gerçekten bir OR ise (burada key1 = 'value1' ve bunun yanı sıra key1 = 'value2' olan yayınları almak istiyorsanız), 'IN' ve bir değer dizisini kullanarak @ WhiskerSandwich'in cevabına bakın. değer parametresi için.

Alternatif olarak, relation'meta_query' için bir parametre sağlayabilirsiniz :

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

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

VEYA'nın aynı anahtarı kullanarak birden fazla meta sorgusu ilişkisi olarak kullanılmasının, kullanmanın işlevsel eşdeğeri INve tek bir tane için bir dizi değer olduğunu unutmayın.


Bunun için teşekkürler Boone. "İlişki" paramının var olduğunu bilmiyordum. Bana yardım etti.
MathSmath

Bu, aranacak tek bir anahtarınız varsa çalışır. İki veya daha fazla varsa, bunları ilişki parametresinde birleştirmek için 'VE' kullanmanız gerekebilir, bu durumda @ WhiskerSandwich'in yanıtı daha uygun olacaktır.
SinisterBeard

14

Aynı anahtar için birden çok diziyi geçirmenin işe yaramadığı aynı sorunu yaşadım. Bunun yerine, sadece bir dizi kullanın, 'value' değerini bir değerler dizisine ayarlayın ve 'compare' değerini IN olarak ayarlayın:

<?php

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

?>

1

Postmeta tablosunun ikinci değeri için takma ad vermelisiniz:

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

Bunu şu anda 3.1'den beri yapabilirsiniz meta_query:

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

Merhaba Milo, cevap verdiğiniz için teşekkürler. SQL değer döndürmez. Diziden 2. anahtarı ve değeri kaldırmadığım sürece dizi de bir değer döndürmez. Yani bu tıkalı mı?
steen

@steen - Sorununuzun ne olduğundan emin değilim, her iki yöntemi de test ettim ve 3.3.1 kurulumumda çalışıyorlar. Anahtarınız kelimenin tam anlamıyla 'key1' ve 'value1' ve 'value2' değerleri midir? Sorgudan print_r( $the_query );hemen sonra bir şey görmüyor musun ?
Milo

0

Anahtar anahtar1'dir ve 'değer1' ve 'değer2' değerleri yirmi on bir ile yeni bir yüklemede hem metni hem de sayısal değeri denedi. print_r ($ the_query); çalışır çıktı normal görünüyor. Ayrıca key1'i denedi ve key2 de çalışmıyor. Bir diziyle sınırlandırdığım anda çalışır. Farklı tarayıcılarla kontrol edildi.

Ancak bu işe yarıyor.

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

 ?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.