Meta_query lồng nhau với nhiều khóa quan hệ


18

Tôi tò mò liệu Wordpress có thể chạy lồng nhau không meta_query, với mỗi khóa có các khóa quan hệ khác nhau? Kể từ Wordpress 3.0, tax_querycó thể thực hiện chức năng này; Tôi đang tự hỏi liệu điều này có tương đương với meta_query.

$results = query_posts( array(
    'post_type' => 'event_id',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            array(
                'key' => 'primary_user_id',
                'value' => $user_id
            ),
            array(
                'key' => 'secondary_user_id',
                'value' => $user_id
            )
        ),
        array(
            'key' => 'date',
            'value' => array( $start_date, $end_date ),
            'type' => 'DATETIME',
            'compare' => 'BETWEEN'
        )
    )
) );

Tài liệu tham khảo:

Câu trả lời:


21

Câu hỏi dành cho Wordpress 3.0, nhưng chỉ trong trường hợp ai đó có cùng câu hỏi cho phiên bản mới hơn, từ Wordpress Codex:

"Bắt đầu với phiên bản 4.1, các mệnh đề meta_query có thể được lồng vào nhau để xây dựng các truy vấn phức tạp."

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameter

Vì vậy, truy vấn đó sẽ hoạt động trên phiên bản Wordpress hiện tại.


9

Điều đó dường như là không thể. Xin ai đó sửa tôi nếu tôi sai.

Các meta_querytham số thực sự sẽ được chuyển thành một WP_Meta_Queryđối tượng, và relationxác minh sẽ không đi sâu hơn trong wp-includes/meta.php, và xảy ra chỉ một lần ở cấp cao nhất:

if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {
    $this->relation = 'OR';
} else {
    $this->relation = 'AND';
}

Một giải pháp khả thi cho việc này là xây dựng THAM GIA của riêng bạn cho truy vấn này.

$query = new WP_Query( array(
    ...
    'my_meta_query' => true,
    'suppress_filters' => false
) );

add_filter( 'posts_join', 'my_meta_query_posts_join', 10, 2 );
function my_meta_query_posts_join( $join, $query ) {

    if ( empty( $query->query_vars['my_meta_query'] ) )
        return $join;

    global $wpdb;

    $new_join = "
        INNER JOIN {$wpdb->postmeta} pm1 ON 1=1
            AND pm1.post_id = {$wpdb->posts}.ID
            AND pm1.meta_key = '_some_meta_key'
            AND pm1.meta_value = 'some_value'
    ";

    return $join . ' ' . $new_join;
}

Và nếu bạn cần xác minh thêm và quy tắc, bạn cũng có thể sử dụng posts_wherebộ lọc.


3
Có vẻ là cách tiếp cận tương tự @ fouu khuyến nghị trên Core Trac: core.trac.wordpress.org/ticket/20312
— Andrew Odri

@AndrewOdri cũng vậy nhưng không phải =)
— vmassuchetto

1

Trong khi đó, điều này là có thể, xem tài liệu với ví dụ và giải thích:

https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameter

và một ví dụ khác https://wordpress.org/support/topic/wp_query-with-mult Môn-meta_query / # post-9410992

'meta_query'  => array(
    'relation' => 'OR',
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 1,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 3000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    ),
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 3001,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 6000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    )
),
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.