WooCommerce中如何根据订单状态获取商品准确总销量
WooCommerce 基于有效订单状态统计商品真实销量
WooCommerce原生的total_sales商品元字段仅在订单进入成交类状态时做累加计算,订单取消、退款、失效时不会自动扣减对应数值,直接读取该字段无法获得真实有效销量。正确的统计逻辑是直接汇总商品关联的、处于有效成交状态订单内的购买数量,排除所有无效状态订单。
可直接替换的实现代码
将你原有的单商品页销量展示代码替换为以下内容即可:
// 在单商品摘要区域输出真实销量 add_action( 'woocommerce_single_product_summary', 'wc_display_real_product_sold_count', 11 ); function wc_display_real_product_sold_count() { global $product; $real_sold_count = wc_calculate_real_product_sales( $product->get_id() ); // 如需保留英文文案 可将下方'已售:%s 件'替换为'Units Sold: %s' echo '<p>' . sprintf( __( '已售:%s 件', 'woocommerce' ), $real_sold_count ) . '</p>'; } // 封装真实销量计算函数 全站可调用 function wc_calculate_real_product_sales( $product_id ) { // 优先读取缓存 避免重复查询拖慢页面加载 $cache_key = 'wc_real_sales_' . $product_id; $cached_value = get_transient( $cache_key ); if ( false !== $cached_value ) { return intval( $cached_value ); } global $wpdb; // 自定义计入销量的有效订单状态 可根据业务需求调整 $valid_statuses = [ 'wc-processing', 'wc-completed' ]; $status_placeholders = implode( ',', array_fill( 0, count( $valid_statuses ), '%s' ) ); // 关联查询有效订单内对应商品(含可变商品子规格)的购买总量 $total_sales = $wpdb->get_var( $wpdb->prepare( "SELECT SUM( order_item_meta.meta_value ) FROM {$wpdb->prefix}woocommerce_order_items as order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id LEFT JOIN {$wpdb->prefix}posts as orders ON order_items.order_id = orders.ID WHERE order_items.order_item_type = 'line_item' AND order_item_meta.meta_key = '_qty' AND orders.post_type = 'shop_order' AND orders.post_status IN ( {$status_placeholders} ) AND order_items.order_item_id IN ( SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key IN ('_product_id', '_variation_id') AND meta_value = %d )", array_merge( $valid_statuses, [ $product_id ] ) ) ); $total_sales = $total_sales ? intval( $total_sales ) : 0; // 写入缓存 有效期1小时 set_transient( $cache_key, $total_sales, HOUR_IN_SECONDS ); return $total_sales; } // 订单状态变动时自动清除对应商品的销量缓存 保证数据实时准确 add_action( 'woocommerce_order_status_changed', 'wc_purge_sales_cache_on_order_update', 10, 4 ); function wc_purge_sales_cache_on_order_update( $order_id, $from_status, $to_status, $order ) { foreach ( $order->get_items() as $item ) { delete_transient( 'wc_real_sales_' . $item->get_product_id() ); if ( $item->get_variation_id() ) { delete_transient( 'wc_real_sales_' . $item->get_variation_id() ); } } }
配置调整说明
- 若仅统计最终交易完成的订单,删除
$valid_statuses数组内的'wc-processing'项,仅保留'wc-completed'即可 - 若站点使用自定义订单状态(如已发货、已签收等),将对应状态带
wc-前缀的slug加入$valid_statuses数组即可纳入销量统计 - 代码内置了 transient 缓存机制,不会重复查询数据库增加服务器负载,订单状态变更时会自动清理对应商品的缓存,无需手动操作
提示:如果需要统计扣除部分退款后的精准销量,可以在计算逻辑中额外关联订单退款记录表,扣减对应退款商品数量即可,上述代码默认按整单有效性统计,适配90%以上普通WooCommerce电商场景需求。
内容的提问来源于stack exchange,提问作者JamesWP
相关产品推荐
相关产品推荐

