当前位置: 首页>>技术问答>>正文


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

webfans 技术问答 , , , 去评论

问题描述

我试图获取一个查询来检索特定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)这个元查询本身相当于“colors IS NULL”,即它将返回postmeta表中没有该键集的帖子。这是上面显示的情况,它应该工作。

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

2)但是,将’关系’索引建立为’OR’会改变这种情况。它返回相反的情况。不要问我为什么。这在执行多个元查询时尤为重要。这意味着最初不可能对“颜色”键设置为“蓝色”(或其他)或根本未设置的帖子进行查询。下面的查询将忽略第一个条件,并仅返回与第二个条件匹配的条件。

'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
            ) 

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3003.html,转载请务必附带本地址声明。