WooCommerce如何按指定user meta数据查询符合要求的订单
问题原因
- 元数据键值配置错误:需求是匹配user meta键为
friseur、值为TestFriseur的用户,但原代码中将meta键写为TestFriseur,和需求完全不符 - 查询逻辑完全反向:原代码使用
OR关系的!=、NOT EXISTS查询,取到的是没有对应meta、或者meta值不等于1的用户,刚好和你要取符合条件用户的需求相反
修正后代码
// 查询符合条件的用户ID:用户角色为customer,meta键friseur值为TestFriseur $user_ids = (array) get_users([ 'role' => 'customer', 'number' => -1, 'fields' => 'ID', 'meta_query' => [ [ 'key' => 'friseur', 'value' => 'TestFriseur', 'compare' => '=' ] ], ]); // 无符合条件用户时直接终止,避免后续无效查询 if (empty($user_ids)) { echo '没有符合条件的订单'; return; } // 用查询到的用户ID获取对应订单 $orders = wc_get_orders([ 'limit' => -1, 'status' => ['on-hold','processing','completed'], 'customer_id' => $user_ids, ]); // 遍历处理订单 foreach( $orders as $order ) { $order_id = $order->get_id(); echo $order_id . '<br>'; // 后续业务逻辑 }
大数据量场景优化方案
如果站点用户、订单量级很大,分两次查询性能偏低,可以直接用自定义SQL一次性查询符合条件的订单,减少数据库交互次数:
global $wpdb; // 订单状态需要补全wc-前缀匹配数据库存储格式 $order_statuses = ['wc-on-hold', 'wc-processing', 'wc-completed']; $order_ids = $wpdb->get_col($wpdb->prepare(" SELECT DISTINCT p.ID FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_customer_user' INNER JOIN {$wpdb->usermeta} um ON pm.meta_value = um.user_id AND um.meta_key = %s AND um.meta_value = %s WHERE p.post_type = 'shop_order' AND p.post_status IN (" . implode(',', array_fill(0, count($order_statuses), '%s')) . ") ", 'friseur', 'TestFriseur', ...$order_statuses)); foreach ($order_ids as $order_id) { $order = wc_get_order($order_id); // 业务逻辑 }
内容的提问来源于stack exchange,提问作者steffi
相关产品推荐
相关产品推荐

