Truy vấn tất cả các bài đăng không tồn tại khóa meta


50

Tôi đang cố gắng để có được một truy vấn để lấy tất cả các bài đăng mà một cụ thể meta_keykhông tồn tại và sau đó tạo nó.

Tôi gặp vấn đề khi tìm những bài đăng đó vì truy vấn tôi đang kiểm tra dường như không hoạt động.

Đây là mã tôi đang sử dụng để cố gắng có được những bài đăng đó:

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

Điều này không trả về gì nếu không có bài đăng nào với khóa colors, nhưng trả về chúng idscủa các bài đăng có khóa colorsbất cứ khi nào có khóa đó (ngược lại với những gì tôi cần). Tôi đã cố gắng EXISTđể thay thế nhưng không có may mắn.

Nếu ai đó có thể mách tôi cách chính xác để tạo một truy vấn như câu hỏi tôi cần, tôi sẽ đánh giá cao nó.

Cảm ơn!


Phiên bản WordPress nào bạn đang sử dụng?
s_ha_dum

Xin chào, xin lỗi vì sự thiếu sót. Tôi đang sử dụng
phiên bản 3.5

Dường như loại truy vấn (với so sánh được đặt thành KHÔNG EXISTS) đã được thêm vào 3.5, vì vậy nó sẽ hoạt động như nó là, theo như tôi có thể thấy. Thật dễ dàng để thực hiện điều đó thông qua truy vấn CHỌN tùy chỉnh, mặc dù ...
Tomas Buteler

Cảm ơn tôi sẽ thử sử dụng chọn. Tôi phải tìm hiểu trước khi bảng nào sẽ truy vấn và cách tuân thủ truy vấn :(
JordanBel

Rất lạ. Tôi không thể phát hiện ra vấn đề với mã đó và bạn đang sử dụng 3.5+, đó là lý do tại sao tôi hỏi. Bạn đã thực sự nhìn vào cơ sở dữ liệu để xác nhận rằng dữ liệu của bạn đang được chèn theo cách bạn nghĩ?
s_ha_dum

Câu trả lời:


73

Tôi đã thực hiện thêm một số thử nghiệm với điều này và thành thật không thể tìm ra lý do nó không hoạt động (trừ khi đoạn mã trên chỉ là đoạn trích và mã thực phù hợp với ví dụ của tôi bên dưới). Tôi đã làm, tuy nhiên, khám phá một vài điều có thể dẫn bạn đi đúng hướng.

1) Chính nó, truy vấn meta này tương đương với "màu IS NULL", nghĩa là nó sẽ trả về các bài đăng không có khóa đó được đặt trong bảng postmeta. Đây là trường hợp hiển thị ở trên, và nó đã hoạt động.

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) Trước WordPress 3.9, việc thiết lập chỉ mục 'quan hệ' thành 'HOẶC' thay đổi điều kiện này. Nó trả lại ngược lại. Đừng hỏi tôi tại sao. Điều này đặc biệt quan trọng khi thực hiện nhiều truy vấn meta. Điều đó có nghĩa là ban đầu không thể thực hiện truy vấn cho các bài đăng có khóa 'màu' được đặt thành 'màu xanh' (hoặc bất cứ thứ gì) hoặc hoàn toàn không được đặt. Truy vấn dưới đây sẽ bỏ qua điều kiện đầu tiên và chỉ trả về những điều kiện phù hợp với điều kiện thứ hai.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) Tuy nhiên, chúng ta có thể đánh lừa WordPress bằng cách sử dụng điều kiện đầu tiên nếu chúng ta đặt 'giá trị'. Nó không cần một giá trị liên quan (theo như tôi biết), nhưng nó cần được đặt để NOT EXISTSđiều kiện có hiệu lực.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

Điều này đúng cho đến khi WordPress 3.9. Nếu bạn vẫn đang sử dụng phiên bản cũ hơn, đây là một cách giải quyết khả thi.


Cảm ơn! Và xin lỗi vì sự chậm trễ. Tôi đã kết thúc bằng một truy vấn, nhưng tôi sẽ kiểm tra giải pháp của bạn trong những giờ sau để tôi có thể chuyển trở lại và có thể nếu công việc này chúng tôi có thể giúp một số khác. Tôi sẽ cho bạn biết ngay khi tôi có thể kiểm tra nó. Cảm ơn một lần nữa
JordanBel

Được viết tốt và xác nhận rằng việc thêm một giá trị trống sẽ trả về kết quả mong đợi. Tôi muốn nói rằng nó vô tình, có thể đáng xem tại trac.wordpress.org để xem nếu đã có vé, nếu không, điều này có thể tái sản xuất.
Taylor Dewey

Cảm ơn lời giải thích và giải pháp tuyệt vời để lừa WP :) Đã mất một chút thời gian để đến đây - nhưng bây giờ tôi muốn nhấp vào upvote ít nhất 10 lần (nếu tôi có thể;))
khỉ lorem 21/03/13

Nếu tôi sử dụng so sánh EXISTS, rất tiếc, giá trị không được bỏ qua trong các phiên bản WP mới hơn (đã được thử nghiệm trong 4.2.2)
Igor Jerosimić

10
Các EXISTSNOT EXISTS"lỗi" mà đòi hỏi bạn phải xác định một giá trị, đã được cố định trong WP 3.9
trex005

11

Sử dụng một truy vấn tùy chỉnh, điều này làm việc cho tôi:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
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.