WooCommerce的后台订单管理支持搜索功能,要扩展搜索功能,首先要明确它能搜什么,不能搜什么。要知道这个信息,读源代码是最快的方法。我们直接找到WooCommerce订单搜索的源代码——class-wc-order-data-store-cpt.php
文件里的search_orders()
函数,这就是搜索调用的函数。
目录
订单搜索的SQL语句
订单搜索会查找两个数据表——wp_postmeta
和wp_woocommerce_order_items
表,假设搜索“Flat rate”,SQL语句如下:
SELECT DISTINCT p1.post_id
FROM wp_postmeta p1
WHERE p1.meta_value LIKE '%Flat rate%'
AND p1.meta_key IN ('_billing_address_index','_shipping_address_index','_billing_last_name','_billing_email')
SELECT order_id
FROM wp_woocommerce_order_items as order_items
WHERE order_item_name LIKE '%Flat rate%'
这两条SQL的查询结果最后被合并到一起作为搜索结果。
订单搜索可以搜什么
可以搜索所有的Order Items以及用户姓名和地址信息,具体来说:
- 订单ID
- 订单备注(用户下单时填写的备注)
- 姓名
- 国家
- 城市
- 州/省
- 具体地址
- 邮编
- 电子邮件地址
- 电话
- 产品名称
- 附加费名称
- 快递名称
- 优惠码名称
- 税费名称
搜索对大小写不敏感。
订单搜索不能搜什么
- 支付方式
- Order Key
- 有退款的订单
- 自定义字段等等
扩展订单搜索功能
例如,让订单搜索支持自定义字段和支付方式,代码如下:
function sola_extend_woocommerce_order_search( $search_fields ) {
$search_fields[] = '_payment_method_title';
$search_fields[] = '_custom_field_key';
return $search_fields;
}
add_filter( 'woocommerce_shop_order_search_fields', 'sola_extend_woocommerce_order_search' );
根据退款原因搜索订单
function sola_woocommerce_order_search_refund( $order_ids, $term ){
global $wpdb;
$search_fields = array( '_refund_reason' );
$like = '%' . $wpdb->esc_like( wc_clean( $term ) ) . '%';
$sql = "SELECT DISTINCT p1.post_parent FROM {$wpdb->posts} p1
LEFT JOIN {$wpdb->postmeta} p2 ON p1.ID = p2.post_id
WHERE p2.meta_value LIKE %s AND p2.meta_key IN ('" . implode( "','", array_map( 'esc_sql', $search_fields ) ) . "')";
$refund_ids = $wpdb->get_col( $wpdb->prepare( $sql, $like ));
$order_ids = array_unique( array_merge( $order_ids, $refund_ids ) );
return $order_ids;
}
add_filter( 'woocommerce_shop_order_search_results', 'sola_woocommerce_order_search_refund',10, 2 );
搜索价格大于某个数值的订单
function sola_woocommerce_order_search_price_above( $order_ids, $term ){
$term = (float)$term;
if( ! $term ){
return $order_ids;
}
global $wpdb;
$args = array(
'posts_per_page' => -1,
'post_type' => array( 'shop_order' ),
'post_status' => array_keys( wc_get_order_statuses()),
'order' => 'DESC',
'fields' => 'ids',
'meta_query' => array(
array(
'key' => '_order_total',
'value' => intval( $term ),
'compare' => '>=',
'type' => 'numeric',
),
),
);
$query = new WP_Query( $args );
wp_reset_postdata();
$order_ids = wp_parse_id_list( ( array_merge( $order_ids, $query->posts ) ) );
return $order_ids;
}
add_filter( 'woocommerce_shop_order_search_results', 'sola_woocommerce_order_search_price_above',10, 2 );