問題描述

我正在嘗試獲取查詢以檢索所有不存在特定 meta_key 的帖子,然後創建它。

我在查找這些帖子時遇到問題,因為我正在測試的查詢似乎不起作用。

以下是我正在使用的代碼來嘗試獲取這些帖子:

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

query_posts($args);

如果沒有關鍵字 colors 的帖子,則不返回任何內容,但是隻要該鍵存在 (與我需要的相反),就可以使用鍵 colors 返回他們的 ids 。我試過 EXIST 而不是運氣。

如果有人可以提示我正確的創建一個我需要的查詢的方式,我會很感激。

謝謝!

最佳解決方案

我做了一些更多的測試,而且老實説,找不到一個不起作用的原因 (除非上面的代碼只是一個代碼段,真正的代碼適合我的例子) 。但是,我確實發現了一些可能導致你朝着正確方向發展的事情。

1) 這個元查詢本身就等同於 「顏色 IS NULL」,即它將返回 postmeta 表中沒有該密鑰集的帖子。這是上面顯示的情況,它應該有效。

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

2) 建立’relation’ 索引到’OR’ 雖然改變了這個條件。反之亦然不要問我為什麼這在執行多個元查詢時尤其重要。這意味着最初不可能對’colors’ 鍵設置為’blue'(或任何) 或不設置的帖子進行查詢。下面的查詢將忽略第一個條件,只返回與第二個條件匹配的條件。

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

3) 但是,如果我們設置’value’,我們可以愚弄 WordPress 使用第一個條件。它不需要相關的值 (據我所知,它被忽略),但是需要設置它才能使 NOT EXISTS 條件有效果。

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

WordPress 3.5 這是真的。也許這是無意的,他們會在以後的版本中修復它,但是可能會有一個這樣的原因,這是一個可行的解決方法。

次佳解決方案

使用自定義查詢,這對我有用:

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
            )

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。