so sánh meta_query trong các đối số get_posts


7

Tôi muốn loại trừ một số bài viết nhất định với một trường tùy chỉnh. Vì vậy, nếu ngay lập tức my_custom_field_ignore1bỏ qua bài viết này. Nếu nó không được đặt bao gồm nó.

Đây là những gì tôi có

    $args = array(
        'post_type' => $post_type,
        'offset' => $offset,
        'meta_query' => array(
            array(
                'key' => 'my_custom_field_ignore',
                'value' => '1',
                'compare' => '!=',
            )
        )
    );

Điều này chỉ hoạt động cho các bài đăng nơi my_custom_field_ignoređược đặt thành một cái gì đó khác1

Làm thế nào tôi có thể bao gồm tất cả các bài viết (tất nhiên không phải là những người có my_custom_field_ignore = 1)?

Biên tập:

Đây là cách nó hoạt động trên WP 3.5+

    'meta_query' => array(
        array(
            'key' => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
        )
    )

Tìm kiếm đơn giản này cho sự xuất hiện của my_custom_field_ignorevì vậy giá trị sẽ bị bỏ qua. Trong khi điều này có thể làm việc ở những người sử dụng ngay từ đầu có thể bị nhầm lẫn khi họ đã thay đổi 1đến 0và mong muốn được đưa vào.

Có vẻ 3,3 và 3,4 cần một số kiểm tra có điều kiện mặc dù.

Chỉnh sửa 2

Có vẻ như câu trả lời đã kiểm tra thực hiện thủ thuật (ít nhất là cho 3,5+). Vì một số lý do kỳ lạ, nó đã bỏ qua bài đăng đầu tiên "Hello World". Sau khi thêm my_custom_field_ignorevà xóa nó sau đó nó hoạt động

Câu trả lời:


9

Nếu chúng ta xác định các điều kiện:

A: my_custom_field_ignore EXISTS
B: my_custom_field_ignore = 1

sau đó NOT ( A && B )tương đương với:

NOT ( A ) || NOT ( B )

ý nghĩa trong trường hợp của chúng tôi:

( my_custom_field_ignore NOT EXISTS ) ||  ( my_custom_field_ignore != 1 ) 

Do đó, chúng tôi có thể thử cách sau cho WP 3.5+ (chưa được kiểm tra):

 $args = array(
    'post_type'  => $post_type,
    'offset'     => $offset,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'my_custom_field_ignore',
            'value'   => '1',
            'compare' => '!=',
        ),
        array(
            'key'     => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
            'value'   => '1',     #<-- just some value as a pre 3.9 bugfix (Codex)
        ),
    )
);

Cảm ơn, tôi sẽ kiểm tra nhưng sẽ hoạt động với 3.3+
Xaver

Tôi đã cập nhật câu trả lời, NOT EXISTSchỉ được hỗ trợ cho WP 3.5+ theo Codex.
bạch dương

xin lỗi, điều này không hoạt động từ 3,3 đến 4,0
Xaver

Tôi vừa thử nghiệm điều này trên bản cài đặt vanilla WP 4.0, nơi nó hoạt động như mong đợi. Đầu ra của bạn là gì? Truy vấn SQL trông như thế nào trong trường hợp của bạn?
bạch dương

pastebin.com/bLSHErMH bạn là gì? (Tôi cũng có số thứ tự => 1 'nhưng tôi đoán điều này không thành vấn đề)
Xaver

1

bạn phải sử dụng chức năng tuần tự hóa trong trường hợp bạn đang sử dụng số nguyên:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'my_meta_key',
            'value' => serialize(strval($my_vale)),
            'compare' => 'LIKE'
        )
    )
);
$posts = get_posts( $args );

và bạn đã sẵn sàng,

print_r($posts); 

và xem kết quả

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.