WooCommerce wc_get_orders的meta_query逻辑及匹配问题咨询
WooCommerce wc_get_orders meta_query 逻辑设置详解
问题1:同一meta_key实现OR逻辑
要实现同一meta_key下的OR匹配(比如value LIKE 'hello kitty' OR value LIKE 'hi dog'),不能直接给value传数组(LIKE不支持数组值,会触发致命错误),正确做法是在meta_query里嵌套子条件数组,并显式设置子条件的relation为OR:
$orders = wc_get_orders( array( 'limit' => -1, 'return' => 'objects', 'orderby' => 'date', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', // 指定子条件间用OR逻辑 array( 'key' => 'custom_meta_data', 'value' => 'hello kitty', 'compare' => 'LIKE' ), array( 'key' => 'custom_meta_data', 'value' => 'hi dog', 'compare' => 'LIKE' ) ), 'type' => 'shop_order', ) );
默认情况下meta_query的子条件会用AND逻辑,所以必须手动设置relation为OR才能达到你要的效果。
问题2:不同meta_key的AND/OR逻辑
实现AND逻辑(默认行为)
如果需要同时满足两个不同meta_key的条件,直接在meta_query里添加多个条件即可,默认就是AND逻辑:
$orders = wc_get_orders( array( 'limit' => -1, 'return' => 'objects', 'orderby' => 'date', 'order' => 'ASC', 'meta_query' => array( // 默认relation为AND,两个条件必须同时满足 array( 'key' => 'meta_key_1', 'value' => 'value_1', 'compare' => '=' ), array( 'key' => 'meta_key_2', 'value' => 'value_2', 'compare' => 'LIKE' ) ), 'type' => 'shop_order', ) );
实现OR逻辑
要满足任意一个不同meta_key的条件,只需给外层meta_query设置relation为OR:
$orders = wc_get_orders( array( 'limit' => -1, 'return' => 'objects', 'orderby' => 'date', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', // 子条件满足其一即可 array( 'key' => 'meta_key_1', 'value' => 'value_1', 'compare' => '=' ), array( 'key' => 'meta_key_2', 'value' => 'value_2', 'compare' => 'LIKE' ) ), 'type' => 'shop_order', ) );
问题3:LIKE的%添加与精确短语匹配
- 关于自动添加%:WooCommerce的
LIKE比较符不会自动在值两端添加%,如果需要模糊匹配(比如字段值包含某字符串),必须手动在value里加上%,例如:array( 'key' => 'custom_meta_data', 'value' => '%hello kitty%', // 手动加%实现包含匹配 'compare' => 'LIKE' ) - 精确短语匹配:直接使用
compare为=即可,此时会严格匹配字段值与给定的value:
如果需要区分大小写的精确匹配,可以配合array( 'key' => 'custom_meta_data', 'value' => 'hello kitty', // 精确匹配该短语 'compare' => '=' )BINARY:array( 'key' => 'custom_meta_data', 'value' => 'Hello Kitty', 'compare' => 'BINARY =' )
内容的提问来源于stack exchange,提问作者Catsy
相关产品推荐
相关产品推荐

