构建WP_User_Query查询数组时,邮编OR查询被自动转为AND的问题
问题解决:WP_User_Query中邮编OR查询被自动转为AND的修复
你的问题出在meta_query的数组结构错误,WordPress解析meta_query时,只会识别每个顶级数组里的relation,而你现在的写法是把relation => 'OR'单独作为一个元素塞进了meta_query数组,之后的每个邮编条件又多套了一层数组,导致WordPress无法识别这个OR关系,默认用AND来关联所有条件。
错误写法的问题点:
你当前的代码会让meta_query变成这样的结构(假设$zips有两个值):
'meta_query' => array( 'relation' => 'AND', // 原有四个条件... array('relation' => 'OR'), array(array('key' => 'shipping_postcode', ...)), array(array('key' => 'shipping_postcode', ...)) )
这种结构下,WordPress会把每个顶级数组元素都当作独立的查询条件,默认用AND关联,所以你的OR根本没起作用。
正确的写法:
应该把所有邮编查询打包成一个子查询组,这个组内部用OR关联,然后把这个组作为一个整体加到原有的meta_query里:
// 先创建邮编查询的子组 $zip_query = array( 'relation' => 'OR' ); foreach($zips as $zip) { $zip_query[] = array( 'key' => 'shipping_postcode', 'value' => $zip, 'compare' => '=', ); } // 把这个子组加到原有的meta_query中 $args['meta_query'][] = $zip_query;
这样最终的meta_query结构是:
'meta_query' => array( 'relation' => 'AND', // 原有四个条件... array( 'relation' => 'OR', // 各个邮编条件... ) )
此时WordPress会正确识别:原有四个条件用AND关联,同时还要满足邮编子组里的任意一个OR条件,整体逻辑是**(原有条件1 AND 原有条件2 ...) AND (邮编1 OR 邮编2 ...)**。
验证方法
修改后可以再次通过$wpUserQuery->request查看生成的SQL,应该能看到邮编部分用OR连接的条件,而不是全部用AND。
内容的提问来源于stack exchange,提问作者Eric Kowalewski
相关产品推荐
相关产品推荐

