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

WooCommerce中wc_get_orders实现MySQL LIKE模糊查询订单方法

WooCommerce订单模糊搜索合规实现方案

wc_get_orders 原生的customer参数仅支持精确匹配用户ID、完整邮箱或准确的用户昵称,不支持部分字符串模糊匹配,不需要手写原生SQL,通过官方开放的查询参数即可实现需求,同时保留内置分页能力,兼顾兼容性和性能。

实现代码

// 初始化请求参数
$rows_per_page = intval( isset($_POST['rowsPerPage']) ? sanitize_text_field($_POST['rowsPerPage']) : 5 );
$page = intval( isset($_POST['page']) ? sanitize_text_field($_POST['page']) : 1 );
$filter = isset($_POST['filter']) ? sanitize_text_field($_POST['filter']) : '';
$filter = $filter === 'undefined' ? '' : $filter;

// 基础查询参数
$args = [
    'limit'    => $rows_per_page,
    'paged'    => $page,
    'paginate' => true,
    'status'   => ['wc-pending', 'wc-processing', 'wc-on-hold', 'wc-completed', 'wc-cancelled', 'wc-refunded', 'wc-failed'],
    'orderby'  => 'date',
    'order'    => 'DESC',
];

// 存在筛选关键词时,添加多字段模糊匹配规则
if ( !empty($filter) ) {
    // 订单账单相关字段存在postmeta表,直接用内置meta_query实现LIKE查询
    $args['meta_query'] = [
        'relation' => 'OR',
        [
            'key'     => '_billing_first_name',
            'value'   => $filter,
            'compare' => 'LIKE'
        ],
        [
            'key'     => '_billing_last_name',
            'value'   => $filter,
            'compare' => 'LIKE'
        ],
        [
            'key'     => '_billing_email',
            'value'   => $filter,
            'compare' => 'LIKE'
        ],
        [
            'key'     => '_billing_phone',
            'value'   => $filter,
            'compare' => 'LIKE'
        ]
    ];

    // 如果需要同时匹配注册用户的登录名、显示名,保留以下逻辑即可,不需要可以删除
    add_filter('woocommerce_order_query_args', function($query_args) use ($filter) {
        global $wpdb;
        // 关联用户表
        add_filter('posts_join', function($join) use ($wpdb) {
            $join_str = " LEFT JOIN {$wpdb->users} ON {$wpdb->posts}.post_author = {$wpdb->users}.ID ";
            if (strpos($join, $join_str) === false) {
                $join .= $join_str;
            }
            return $join;
        });
        // 添加用户字段匹配条件
        add_filter('posts_where', function($where) use ($wpdb, $filter) {
            $escaped_filter = '%' . $wpdb->esc_like($filter) . '%';
            $where .= $wpdb->prepare(
                " OR ({$wpdb->users}.user_login LIKE %s OR {$wpdb->users}.display_name LIKE %s) ",
                $escaped_filter,
                $escaped_filter
            );
            return $where;
        });
        return $query_args;
    });
}

// 执行查询
$results = wc_get_orders($args);
$orders = $results->orders; // 当前页订单对象,可直接调用WC_Order官方方法取值
$total = $results->total; // 自动返回匹配的订单总数,无需单独写count查询
$max_pages = $results->max_num_pages; // 自动计算总页数

方案对比原生SQL的优势

  • 完全遵循WooCommerce/WordPress开发规范,所有查询逻辑走官方封装的方法,只要官方不做破坏性的API向下兼容调整就不会出问题,不用担心后续数据库结构变动导致故障
  • 开启paginate参数后框架自动完成总数统计、分页计算,不需要执行两次重复查询
  • 框架层自动完成SQL转义,不存在原生SQL直接拼接参数带来的注入风险
  • 返回结果是标准WC_Order对象,不需要手动读取postmeta格式化数据,直接调用官方方法即可获取订单所有字段

优化提示

  • 如果站点订单量超过10万,建议给wp_postmeta表的meta_key、meta_value字段添加联合索引,可大幅提升模糊查询速度
  • 如果需要支持收货地址、公司名等其他字段搜索,直接在meta_query数组中添加对应meta key的查询规则即可
  • 如果不需要匹配姓氏、注册用户信息,直接删除对应查询段即可,不会影响其他逻辑

内容的提问来源于stack exchange,提问作者Đức Thanh Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:42:21