You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:15:04