Truy vấn nhiều giá trị khóa meta?


22

Làm thế nào để truy vấn các giá trị khóa meta đa dạng với cùng một khóa

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

mã tiếp theo

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

Câu trả lời:


31

Tôi cảm thấy như có một sự nhầm lẫn VÀ / HOẶC đang diễn ra ở đây.

Các truy vấn trong OP sẽ chỉ trả về các bài đăng có cả key1 = 'value1' AND key2 = 'value2'. Hầu hết các plugin WP (dù sao tôi biết) không lưu trữ nhiều giá trị trong postmeta, cho cùng một bài đăng, sử dụng cùng một khóa.

Nếu những gì bạn muốn thực sự là OR (bạn muốn nhận các bài đăng trong đó key1 = 'value1', cũng như các bài đăng trong đó key1 = 'value2'), thì hãy xem câu trả lời của @ WhiskerSandwich, sử dụng 'IN' và một loạt các giá trị cho tham số giá trị.

Ngoài ra, bạn có thể cung cấp một relationtham số cho `meta_query ':

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

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

Lưu ý rằng sử dụng OR làm quan hệ cho nhiều truy vấn meta bằng cùng một khóa là tương đương về chức năng của việc sử dụng INvà một mảng các giá trị cho một truy vấn duy nhất.


Cảm ơn vì điều này, Boone. Tôi không biết "quan hệ" param tồn tại. Giúp tôi ra ngoài.
MathSmath

Điều này hoạt động nếu bạn chỉ có một phím để tìm kiếm. Nếu bạn có hai hoặc nhiều hơn, bạn có thể cần sử dụng 'VÀ' để kết hợp chúng trong tham số mối quan hệ, trong trường hợp đó, câu trả lời của @ WhiskerSandwich dưới đây là phù hợp hơn.
SinisterBeard

14

Tôi đã có cùng một vấn đề khi chuyển nhiều mảng cho cùng một khóa không hoạt động. Thay vào đó, chỉ cần sử dụng một mảng, đặt 'giá trị' thành một mảng các giá trị và đặt 'so sánh' thành IN:

<?php

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

?>

1

Bạn phải đặt bí danh cho bảng postmeta cho giá trị thứ hai:

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

Bạn cũng có thể làm điều này ngay bây giờ kể từ 3.1 với meta_query:

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

Xin chào Milo cảm ơn vì đã trả lời. SQL không trả về giá trị. Và mảng cũng không trả về giá trị trừ khi tôi loại bỏ khóa thứ 2 và giá trị khỏi mảng. Vì vậy, đây là lỗi?
steen

@steen - Tôi không chắc vấn đề của bạn là gì, tôi đã thử cả hai phương pháp và chúng đang hoạt động trong bản cài đặt 3.3.1 của tôi. Khóa của bạn có nghĩa đen là 'key1' và giá trị 'value1' và 'value2'? Bạn có thấy gì không nếu bạn print_r( $the_query );ngay sau khi truy vấn?
Milo

0

Khóa là key1 và các giá trị 'value1' và 'value2' đã thử cả văn bản và số trong một bản cài đặt mới với hai mươi mười một. print_r ($ the_query); đầu ra công trình trông bình thường. Cũng đã thử key1 và key2 cũng không hoạt động. Nó hoạt động ngay khi tôi giới hạn nó trong một mảng. Đã kiểm tra với các trình duyệt khác nhau.

Điều này tuy nhiên không hoạt động.

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

 ?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.