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
相关产品推荐
相关产品推荐

