You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:51:19