如果使用共享的META_KEY存储多个POST_META值,则META_QUERY为负

时间:2021-12-20 作者:John Ryan

WordPress支持使用相同的元键为单个帖子存储多个帖子元值。例如,一篇文章可以有多个meta\\u键“pet”的实例,meta\\u值为“cat”、“dog”和/或“fish”。这在使用get\\u post\\u meta时非常有用,因为您可以获取pet meta键的所有值的数组,而不是在单个字段中管理序列化数组。

当使用元查询时,它也非常有用,因为您可以查询meta\\u键“pet”为“cat”的任何帖子,并获取“pet”的任何实例等于“cat”的帖子,而不管有多少元键的其他实例可能与具有不同值的帖子相关联。

但恰恰相反(例如。!=NOT LIKENOT IN) 可能的我正在使用下面的内容,它返回了很多帖子,其中有一个meta\\u key“pet”=“cat”的实例。

$pet_owners = new WP_Query([
  \'post_type\' => \'pet_owner\',
  \'posts_per_page\' => -1,
  \'meta_query\' => [
    [
      \'key\' => \'pet\',
      \'value\' => \'cat\',
      \'compare\' => \'!=\'
    ]
  ]
]);
Edit: 我的伪代码中有一个错误,由下面的Buttered\\u toast标记。

2 个回复
SO网友:Buttered_Toast

这是因为您创建了meta_query 属性不正确,它应该是多维数组。

$pet_owners = new WP_Query([
    \'post_type\' => \'pet_owner\',
    \'posts_per_page\' => -1,
    \'meta_query\' => [
        [
            \'key\' => \'pet\',
            \'value\' => \'cat\',
            \'compare\' => \'!=\'
        ]
    ]
]);
有关的更多信息meta_query 看见Custom Field (post meta) Parameters

SO网友:John Ryan

在深入研究我的问题时,似乎唯一的方法是进行两个查询:

首先,询问所有有猫的宠物主人

$cat_owners = new WP_Query([
  "post_type" => "pet_owners", 
  "posts_per_page" => -1, 
  "meta_key" => "animal", 
  "meta_value" => "cat"
])
然后,查询所有不在第一次查询结果中但至少拥有一只宠物的宠物主人(因此"meta_compare" => "EXISTS"):

$not_cat_owners = new WP_Query([
  "post_type" => "pet_owners", 
  "posts_per_page" => -1, 
  "post__not_in" => $cat_owners,
  "meta_key" => "animal", 
  "meta_compare" => "EXISTS"
])
这将产生一个没有猫的宠物主人列表,但对一组结果进行两次WP\\U查询感觉很愚蠢,因此我选择使用$wpdb类直接对DB进行查询。

这允许以下情况:

$wpdb->get_results("SELECT ID FROM $wpdb->posts 
  WHERE post_status = \'publish\' 
  AND post_type = \'pet_owner\' 
  AND ID IN
    (SELECT post_id FROM $wpdb->postmeta 
     WHERE meta_key = \'animal\')
  AND ID NOT IN 
    (SELECT post_id FROM $wpdb->postmeta 
     WHERE meta_key = \'animal\' 
     AND meta_value = \'cat\')");
我猜从技术上讲,这是三个查询(主查询和两个嵌套查询),但看起来更干净、更简单。我很想知道是否有比我更好的SQL技能的人可以想出一种更有效的方法来实现这一点。

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在