查询不存在元键的所有帖子


50

我试图获取一个查询以检索所有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,但是只要该键存在(与我需要的相反),就返回ids带有该键的帖子colors。我尝试了EXIST但没有运气。

如果有人可以向我提示创建查询的正确方式(如我需要的那样),我将不胜感激。

谢谢!


您正在使用哪个版本的WordPress?
s_ha_dum

嗨,抱歉。我正在使用v3.5
JordanBel

好像在3.5中添加了该类型的查询(compare设置为NOT EXISTS),所以据我所知它应该可以正常工作。不过,通过自定义SELECT查询会很容易做到这一点
Tomas Buteler 2013年

谢谢,我会尝试使用选择。我必须了解要查询哪些表以及如何使查询一致:(
JordanBel

很奇怪。我找不到该代码的问题,而您使用的是3.5+,这就是我问的原因。您是否实际上已经查看了数据库以确认是否按照您认为的方式插入了数据?
s_ha_dum

Answers:


73

我对此进行了更多测试,坦白地说,找不到它不起作用的原因(除非上面的代码只是摘录,并且真实的代码适合下面的示例)。但是,我确实发现了一些可能会引导您朝正确方向发展的事情。

1)就其本身而言,此元查询等效于“ colors IS NULL”,即它将返回postmeta表中未设置该键的帖子。这是上面显示的情况,它应该已经起作用。

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

2)在WordPress 3.9之前,将“关系”索引建立为“或”会更改此条件。它返回相反的结果。不要问我为什么。在执行多个元查询时,这一点尤其重要。这意味着最初不可能对“颜色”键设置为“蓝色”(或其他设置)或根本没有设置的帖子进行查询。下面的查询将忽略第一个条件,仅返回那些与第二个条件匹配的查询。

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

3)但是,如果我们设置“值”,我们可以欺骗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.9为止都是如此。如果您仍在使用旧版本,这是一个可行的解决方法。


谢谢!很抱歉造成您的延迟。我最终使用了一个查询,但是接下来的几个小时我将测试您的解决方案,以便我可以切换回去,也许如果这项工作我们可以帮助您。我会尽快通知您。再次感谢
JordanBel 2013年

写得很好,并确认添加空值将返回预期结果。我想说这是无意的,值得在trac.wordpress.org上看看是否已经有一张票,如果没有,这是可复制的。
泰勒·杜威

感谢伟大的解释和解决方案来欺骗WP :)确实需要一些时间来这里-但现在我想点击给予好评至少10倍(如果我能;))
LOREM猴

如果我使用EXISTS比较,数值可惜不是在WP的较新版本忽略(4.2.2测试)
伊戈尔Jerosimić

10
EXISTSNOT EXISTS“虫”,它要求你指定一个值,固定在WP 3.9
trex005

11

使用自定义查询,这对我有用:

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
            ) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.