为什么在 get_posts() 中不使用“IN”比较 wordpress?

问题描述 投票:0回答:1

我有 acf 字段“复选框”。有 3 个值:

  • 红色:红色
  • 绿色:绿色
  • 蓝色:蓝色

在帖子中我选择了以下值,但我无法获取这些值的记录。

$posts = get_posts([
 'post_type'  => 'products', //my custom post type
 'meta_query' => [
  'relation' => 'AND',
  [
   'key' => 'colors',// acf field name
   'value' => ['green', 'blue'],
   'compare' => 'IN',
  ],
  [...],
 ],
]);
wordpress
1个回答
0
投票

IN 在这种情况下不起作用的原因是 ACF 为复选框字段存储的值是序列化的 PHP 字符串。

作为存储您提到的颜色的示例,您最终会在 meta_value 数据库字段中保存如下所示的值:

a:3:{i:0;s:3:"red";i:1;s:5:"green";i:2;s:4:"blue";}
a:1:{i:0;s:3:"red";}
a:2:{i:0;s:3:"red";i:1;s:5:"green";}
a:1:{i:0;s:4:"blue";}

为了查询这些,您需要将整个字段视为一串数据并执行 LIKE 比较/比较。

为了确保获得正确的值,您可以在字符串周围使用双引号来匹配,即使用“红色”而不是仅将“红色”视为字符串。其中双引号没有任何特殊含义。

“red”和“red”都可以,但后者也会用 LIKE 匹配 reddragon。

您的代码看起来像这样,当然,根据需要继续添加更多和嵌套 meta_query 部分。

$posts = get_posts([
    'post_type' => 'products',
    'meta_query' => [
        'relation' => 'AND',
        [
            'key' => 'colors',
            'value' => '"green"',
            'compare' => 'LIKE',
        ],
        [
            'key' => 'colors',
            'value' => '"blue"',
            'compare' => 'LIKE',
        ],
    ],
]);
© www.soinside.com 2019 - 2024. All rights reserved.