สอบถามค่าคีย์เมตาหลายรายการหรือไม่


22

วิธีการค้นหาค่าคีย์เมตา mutiple ด้วยคีย์เดียวกัน

$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 / หรือเกิดขึ้นที่นี่

ข้อความค้นหาใน OP จะแสดงเฉพาะข้อความที่มีทั้ง key1 = 'value1' และ key2 = 'value2' ปลั๊กอิน WP ส่วนใหญ่ (ที่ฉันรู้อยู่แล้ว) จะไม่เก็บค่าหลายค่าใน postmeta สำหรับโพสต์เดียวกันโดยใช้คีย์เดียวกัน

หากสิ่งที่คุณต้องการคือ OR จริงๆ (คุณต้องการได้รับโพสต์โดยที่ key1 = 'value1' เช่นเดียวกับโพสต์ที่ key1 = 'value2') จากนั้นดูคำตอบของ @ WhiskerSandwich โดยใช้ 'IN' และอาร์เรย์ของค่า สำหรับพารามิเตอร์ค่า

หรือคุณสามารถระบุ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

ใช้งานได้ถ้าคุณมีคีย์เดียวที่จะค้นหา หากคุณมีสองคนขึ้นไปคุณอาจต้องใช้ 'และ' เพื่อรวมไว้ในพารามิเตอร์ความสัมพันธ์ซึ่งในกรณีนี้ @ WhiskerSandwich คำตอบด้านล่างจะเหมาะกว่า
SinisterBeard

14

ฉันมีปัญหาเดียวกันกับที่ผ่านหลายอาร์เรย์สำหรับคีย์เดียวกันไม่ทำงาน ให้ใช้อาร์เรย์เดียวแทนตั้งค่าเป็นค่าอาร์เรย์และตั้งค่า 'เปรียบเทียบ' เป็น:

<?php

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

?>

1

คุณต้องนามแฝงตาราง 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 ไม่ส่งคืนค่าใด ๆ และอาร์เรย์ก็ไม่ส่งคืนค่าเช่นกันเว้นแต่ฉันจะลบคีย์ที่สองและค่าออกจากอาร์เรย์ ดังนั้นนี่คือบั๊ก
steen

@steen - ฉันไม่แน่ใจว่าปัญหาของคุณคืออะไรฉันได้ทดสอบทั้งสองวิธีและพวกเขากำลังทำงานในการติดตั้ง 3.3.1 ของฉัน คีย์ของคุณอย่างแท้จริง 'key1' และค่า 'value1' และ 'value2' หรือไม่ คุณไม่เห็นอะไรเลยprint_r( $the_query );หลังจากค้นหาทันทีหรือไม่
Milo

0

คีย์คือ key1 และค่า 'value1' และ 'value2' ลองทั้งข้อความและตัวเลขในการติดตั้งใหม่ด้วยยี่สิบเอ็ด print_r ($ the_query); ผลงานดูเหมือนปกติ ลองใช้ key1 และ key2 ด้วยเช่นกัน มันทำงานได้ทันทีที่ฉัน จำกัด ให้เหลือหนึ่งอาร์เรย์ ตรวจสอบกับเบราว์เซอร์ที่แตกต่างกัน

อย่างไรก็ตามสิ่งนี้ใช้งานได้

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