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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.