WordPress中meta_query两种场景失效问题求助
解决WordPress get_posts()中meta_query不生效的问题
我得先拆解你遇到的两个查询问题,都是WordPress元查询里常见的细节坑:
1. space_avail_days数组字段的匹配问题
你说这个字段存的是日期缩写数组,但WordPress默认会把数组类型的自定义字段序列化为字符串存储在数据库里(比如a:3:{i:0;s:3:"mon";i:1;s:3:"tue";i:2;s:3:"wed";})。这时候用IN查询完全无效,因为数据库里存的不是单独的'mon'/'tue'值,而是一整串序列化文本。
解决方法分两种,根据你的存储方式选择:
- 如果是用ACF的数组字段,且开启了「将数组存储为单独的元行」(ACF设置里的选项),那可以继续用
IN;但默认ACF是序列化存储的,更通用的方法是用REGEXP匹配数组中是否包含目标值:array( 'key' => 'space_avail_days', 'value' => '"(mon|tue|wed)"', // 匹配序列化字符串里的单个值,加双引号避免误匹配 'compare' => 'REGEXP' ) - 也可以拆成多个
OR条件的子查询,逻辑更直观:array( 'relation' => 'OR', array('key' => 'space_avail_days', 'value' => '"mon"', 'compare' => 'LIKE'), array('key' => 'space_avail_days', 'value' => '"tue"', 'compare' => 'LIKE'), array('key' => 'space_avail_days', 'value' => '"wed"', 'compare' => 'LIKE') )
2. space_settings_restricted排除'restricted'的问题
你要匹配值为null、空值或者字段不存在的帖子,但原来的!= 'restricted'只能匹配**存在该字段且值不是'restricted'**的帖子,会漏掉那些根本没有这个字段(也就是值为null)的帖子。
正确的做法是用relation组合多个条件:
array( 'relation' => 'OR', // 字段不存在(对应值为null的情况) array('key' => 'space_settings_restricted', 'compare' => 'NOT EXISTS'), // 字段值为空字符串 array('key' => 'space_settings_restricted', 'value' => '', 'compare' => '='), // 字段值不是'restricted' array('key' => 'space_settings_restricted', 'value' => 'restricted', 'compare' => '!=') )
完整的meta_query示例
把两个条件组合起来,记得外层的relation设为AND(因为两个条件都要满足):
'meta_query' => array( 'relation' => 'AND', // 第一个条件:匹配至少一个可用日期 array( 'key' => 'space_avail_days', 'value' => '"(mon|tue|wed)"', 'compare' => 'REGEXP' ), // 第二个条件:排除restricted的帖子 array( 'relation' => 'OR', array('key' => 'space_settings_restricted', 'compare' => 'NOT EXISTS'), array('key' => 'space_settings_restricted', 'value' => '', 'compare' => '='), array('key' => 'space_settings_restricted', 'value' => 'restricted', 'compare' => '!=') ) )
额外排查点
- 确认自定义字段键名完全正确(比如有没有大小写错误、前后空格)
- 如果用ACF,要确保用的是字段键(不是字段名,ACF的字段键是类似
field_xxxxxx的字符串吗?不对,应该是你设置的字段名称,比如space_avail_days,别搞混) - 可以直接去数据库的
wp_postmeta表查这两个字段的实际存储值,确认和你预期的一致
内容的提问来源于stack exchange,提问作者Eckstein
相关产品推荐
相关产品推荐

