WooCommerce

使WooCommerce订单搜索支持自定义字段(2021)

WooCommerce的后台订单管理支持搜索功能,要扩展搜索功能,首先要明确它能搜什么,不能搜什么。要知道这个信息,读源代码是最快的方法。我们直接找到WooCommerce订单搜索的源代码——class-wc-order-data-store-cpt.php文件里的search_orders()函数,这就是搜索调用的函数。

订单搜索的SQL语句

订单搜索会查找两个数据表——wp_postmetawp_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 );