我试图获取一个查询来检索所有不存在特定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?

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

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

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

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

#1 楼

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

1)就其本身而言,此元查询等效于“ colors IS NULL”,即它将返回postmeta表中未设置该键的帖子。

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


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

'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为止都是如此。如果您仍在使用旧版本,这是一个可行的解决方法。

评论


谢谢!很抱歉造成您的延迟。我最终使用了一个查询,但接下来的几个小时我将测试您的解决方案,以便我可以切换回去,如果可以的话,我们可以提供其他帮助。我会尽快通知您。再次感谢

–乔丹·贝尔
2013年1月17日在1:49

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

–泰勒·杜威
2013年3月6日19:22



感谢您对WP技巧的出色解释和解决方案:)确实花了一些时间才能到达这里-但现在我要单击upvote至少10次(如果可以的话)。

– lor猴
13年3月21日在14:18

如果我使用compare EXISTS,不幸的是,在新版本的WP中未忽略值(在4.2.2中进行了测试)

–伊戈尔·耶罗西米奇(IgorJerosimić)
15年7月1日在10:08

WP 3.9中修复了需要您指定值的EXISTS和NOT EXISTS“错误”

–trex005
16年4月15日在7:42

#2 楼

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

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
            ) 


#3 楼

这对我有用。

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