WooCommerce后台订单列表如何实现按订单状态搜索功能

WooCommerce订单列表按状态搜索实现方案
你当前使用的woocommerce_shop_order_search_fields过滤器仅支持扩展*自定义字段(post_meta)*作为搜索条件,而订单状态存储在WordPress默认posts表的post_status字段中,不属于自定义元数据,因此无法直接通过该过滤器添加支持。你可以新增一段查询逻辑来实现订单状态搜索,同时保留原有自定义字段的搜索能力。
完整可直接使用的代码
// 原有逻辑:扩展手机号、订单总金额为可搜索字段 add_filter( 'woocommerce_shop_order_search_fields', 'shipping_awb_searchable_field', 10, 1 ); function shipping_awb_searchable_field($meta_keys){ $meta_keys[] = '_billing_phone'; $meta_keys[] = '_order_total'; return $meta_keys; } // 新增逻辑:支持按订单状态搜索 add_action( 'pre_get_posts', 'add_order_status_to_search', 20 ); function add_order_status_to_search( $query ) { // 仅在后台订单列表页面、且是搜索请求时生效 if ( ! is_admin() || $query->get( 'post_type' ) !== 'shop_order' || empty( $query->get( 's' ) ) ) { return; } $search_term = trim( $query->get( 's' ) ); $order_statuses = wc_get_order_statuses(); $matched_statuses = array(); // 匹配订单状态的slug或者中文名称 foreach ( $order_statuses as $status_slug => $status_name ) { if ( stripos( $status_slug, $search_term ) !== false || stripos( $status_name, $search_term ) !== false ) { $matched_statuses[] = $status_slug; } } // 如果匹配到对应状态,修改查询条件 if ( ! empty( $matched_statuses ) ) { $query->set( 'post_status', $matched_statuses ); // 清空原搜索关键词条件,避免和其他字段冲突 $query->set( 's', '' ); // 保留原搜索词用于页面显示 add_filter( 'get_search_query', function() use ( $search_term ) { return $search_term; }); } }
使用说明
- 可以直接在订单搜索框输入订单状态的中文名称(比如「处理中」「已完成」)或者英文slug(比如「processing」「completed」),即可筛选出对应状态的所有订单
- 原有手机号、订单金额搜索功能不受影响
如果你需要同时支持关键词同时匹配订单状态和其他字段(比如手机号、订单号),可以删除代码中
$query->set( 's', '' );这一行即可。
内容的提问来源于stack exchange,提问作者MAKHDUM HUSAIN GULAM HAIDER NA
相关产品推荐
相关产品推荐

