meta_query cho các khóa chưa được đặt


8

Tôi đang cố gắng truy vấn loại bài đăng tùy chỉnh cho hệ thống thư viện. Tôi có một hộp kiểm để đặt một bộ sưu tập thành một bộ sưu tập "đặc trưng" (được thiết lập thông qua plugin Nhiều lĩnh vực hơn) - nếu điều này được kiểm tra thì giá trị meta trở thành 1 và sau đó nếu không được chọn, nó sẽ trở thành 0. Tất cả đều tốt. Tuy nhiên, nếu hộp chưa bao giờ được kiểm tra thì khóa meta không bao giờ được tạo, có nghĩa là tôi không thể truy vấn KHÔNG THÍCH 1 vì nó không tồn tại.

Truy vấn tôi muốn là lấy ra 4 phòng trưng bày không được đánh dấu là '1' trong giá trị meta này, nhưng cũng có những phòng không có giá trị này. Có cách nào để luôn cung cấp cho các bài đăng mới được thêm một giá trị mặc định cho khóa meta này (tức là luôn đặt chúng 0 theo mặc định nếu hộp không được chọn) hoặc có cách nào để truy vấn khóa chưa được đặt không?

Truy vấn hiện tại của tôi là:

$args = array(
                        'post_type' => 'gallery',
                        'showposts' => 4,
                        'meta_key' => 'gal-ID',
                        'order_by' => 'meta_value',
                        'order' => 'ASC',
                        'meta_query' => array( array(
                                            'key' => 'main-gal',
                                            'value' => false,
                                        ) ),
                        ) );

Và tôi đã thử nhiều cách với 'so sánh' => 'KHÔNG THÍCH', '! =' V.v.

Có ý kiến ​​gì không? Chiếc vé này dường như ngụ ý nó là thứ gì đó nên được sắp xếp:

http://core.trac.wordpress.org/ticket/18158

Cảm ơn!

Câu trả lời:


7

Hàm lớn đó hơi đáng sợ, tôi đã làm việc này như vậy - với hai đối số (loại trừ các tính năng)

$args = array(

    'meta_query' => array(
        'relation' => 'OR',
            array( // new and edited posts
                'key' => 'Set as Featured Post',
                'compare' => '!=',
                'value' => 1
            ),

            array( // get old posts w/out custom field
                'key' => 'Set as Featured Post',
                'value' => '1',
                'compare' => 'NOT EXISTS'
            ) 
        ),
    'posts_per_page' => 30

);

Mảng đầu tiên của tôi là ghi đè thứ hai của tôi với giải pháp này. Có vẻ như bạn không thể truy vấn hai lần cùng một lĩnh vực?
Allen Gingrich

3

Theo Thông số trường tùy chỉnh trong Codex, NOT EXISTSso sánh đặc biệt có sẵn kể từ phiên bản WP 3.5

Về mặt kỹ thuật, nó tạo ra một cái gì đó giống như truy vấn SQL trong các yêu cầu bài viết:

$posts = get_posts( array(
    'meta_query' => array(
        array(
            'key'     => 'wrong',
            'compare' => 'NOT EXISTS',
        ),
    ),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5

Nó hoạt động bằng cách tham gia bảng meta trên khóa được cung cấp và chỉ chọn các bản ghi trong đó không dẫn đến dữ liệu có ý nghĩa ( IS NULL). Vì vậy, nó chỉ có tác dụng đối với trường hợp khi chìa khóa không tồn tại ở tất cả và sẽ không làm việc cho các phím mà tồn tại với falsy giá trị.


Tôi bị thu hút bởi sự NOT EXISTSso sánh này . Để giải quyết các khóa meta chưa được đặt, tôi chỉ lưu 0 trên save_postmóc nếu khóa meta không được đặt. Làm thế nào để NOT EXISTSlàm việc? Nó sẽ sắp xếp truy vấn của OP theo main-galvà sau đó điền vào 4 với các bài đăng không có meta đó?
xe đạp

@helgatheviking Tôi đã giải thích chi tiết về cơ học trong câu trả lời
Rarst

2

Như vé đã chỉ ra, nó không được hỗ trợ .. cho đến lúc đó bạn sẽ phải dựa vào một giải pháp tùy chỉnh.

Một vài người dùng đã yêu cầu điều này trước đây, hoặc ít nhất là hỏi làm thế nào để thực hiện nó trên các diễn đàn WordPress.org, vì vậy tôi đã viết một chức năng để thực hiện công việc mà tôi không bao giờ giữ (pastebinned), may mắn thay tôi đã tìm thấy chủ đề ban đầu nơi tôi đã cung cấp liên kết pastebin (không nên hết hạn).

http://pastebin.com/kgLt1RrG

Tôi đã viết rằng 8 tháng trước và tôi đã không kiểm tra nó (kể từ đó), vì vậy hãy cho tôi biết bất kỳ vấn đề nào.

Mong rằng sẽ giúp ..


Thật tuyệt, cảm ơn vì điều này - sẽ kiểm tra nó vào tối nay và cho bạn biết điều gì xảy ra.
artparks

1

Phương pháp đơn giản nhất, mặc dù không phải là sạch nhất:

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

Điều này sẽ cung cấp cho bạn tất cả các phòng trưng bày của bạn được sắp xếp theo khóa meta. Bước tiếp theo là tìm hiểu xem các phòng trưng bày có giá trị 1 đến sau hay trước các bài đăng khác. Bằng cách này bạn có thể:

  • Xử lý các mục cho đến khi bạn xử lý 4 mục thư viện hoặc đạt được một bài đăng có giá trị meta là 1
  • Bỏ qua các bài đăng có giá trị meta 1 sau đó bắt đầu xử lý khi bạn đạt đến giá trị không 1 đầu tiên

Các phương thức khác không yêu cầu câu lệnh SQL tùy chỉnh:

  • Thực hiện truy vấn để tìm các phòng trưng bày mà bạn không muốn, sử dụng nó để điền vào một mảng ID bài đăng, sau đó thực hiện truy vấn thứ hai, chuyển mảng đó dưới dạng bài đăng để loại trừ
  • Sử dụng phân loại thay vì các trường tùy chỉnh (giải quyết vấn đề này khá độc đáo và đưa ra rất nhiều cải tiến tốt đẹp khác miễn phí để nó cũng giúp bạn tiết kiệm thời gian)
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.