问题描述

我正在尝试获取查询以检索所有不存在特定 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。