From Get the customer's total spend for a period of 1 year in WooCommerce answer to my previous question:

// Utility function: Get customer orders total amount from specific status on a period
function get_orders_sum_amount_for( $user_id, $period = '1 year', $status = 'completed' ) {
    global $wpdb;
    return $wpdb->get_var( $wpdb->prepare( "
        SELECT SUM(total_amount)
        FROM {$wpdb->prefix}wc_orders
        WHERE status = %s
        AND customer_id = %d
        AND date_created_gmt >= %s
    ", 'wc-'.$status, $user_id, date('Y-m-d H:i:s', strtotime('-'.$period) ) ) );
}
add_shortcode('user_year_total_spent', 'get_user_year_total_spent');
function get_user_year_total_spent( $atts ) {
    extract( shortcode_atts( array(
        'user_id' => get_current_user_id(),
    ), $atts, 'user_year_total_spent' ) );

    if( ! $user_id ) return;

    $total_spent = get_orders_sum_amount_for( $user_id ); // Get total spent amount

    if( $total_spent >= 1200 ) {
        $text = __('Congrats you are now tier 3.', 'woocommerce');
    } elseif ( $total_spent >= 600 ) {
        $text = __('Congrats you are now tier 2.', 'woocommerce');
    } else {
        $text = __('Congrats you are now tier 1.', 'woocommerce');
    }
    return sprintf(__('Total Amount Spent: %s. %s', 'woocommerce'), wc_price($total_spent), $text);
}

// SHORTCODE USAGE: [user_year_total_spent]

它接收所有完成的用户订单在一段时间内的总支出.

但我面临的事实是,如果订单部分退回,那么总支出不会减少部分退款的金额.

示例: 订购3件T恤 * 10欧盟. 总支出30欧元.交付费用不包括在总支出中. 此外,该订单中的买方退回了1件T恤 * 10欧元.管理员手动发放了部分退款. 订单状态"已完成",2件T恤 * 20欧盟.但总支出仍为30欧元.

如何从总支出中提取exclude a partial manual refund

推荐答案

要处理WooCommerce退款的客户总支出,替换第一个函数:

function get_orders_sum_amount_for( $user_id, $period = '1 year', $status = 'completed' ) {
    global $wpdb;

    $date   = date('Y-m-d H:i:s', strtotime('-'.$period) );
    $status = 'wc-'.$status;

    $total_orders = (float) $wpdb->get_var( $wpdb->prepare( "
        SELECT SUM(total_amount) FROM {$wpdb->prefix}wc_orders
        WHERE status = %s AND customer_id = %d AND date_created_gmt >= %s
    ", $status, $user_id, $date ) );

    $total_refunds = (float) $wpdb->get_var( $wpdb->prepare( "
        SELECT SUM(r.total_amount)
        FROM {$wpdb->prefix}wc_orders r
        LEFT JOIN {$wpdb->prefix}wc_orders o ON r.parent_order_id = o.id
        WHERE r.type = 'shop_order_refund' AND r.status = %s
        AND o.customer_id = %d AND o.date_created_gmt >= %s
    ", $status, $user_id, $date) );

    return $total_orders + $total_refunds;
}

代码会在活动子主题(或活动主题)的functions.php文件中.测试和工作.

Php相关问答推荐

如何在搜索域名时重定向到登陆页?

累加平面数组中数字子集的所有组合,以生成组合及其乘积的二维数组

过滤WooCommerce管理员订单列表(+HPOS)中包含其作者产品的订单

允许在WooCommerce管理员优惠券列表中显示自定义优惠券类型

Laravel Nova不使用数组键作为筛选器中的选项值

根据WooCommerce Cart小计阈值自动应用优惠券

未收到Strava WebHook事件数据

Woocommerce单一产品Ajax添加到带有自定义购物车项目数据的购物车

为什么 debug_backtrace() 不返回任何内容?

在特征中使用类的属性

Laravel 添加到经过身份验证的用户的数据将应用于每个查询

PHP:如何将多列sql查询结果转换成数组

PHP 合并/合并多维数组

Laravel 8:会话不适用

如何在 Process facade 中转义特殊字符?

PHP Remedy API 调用以创建附件无效的条目(使用 Postman Works!)

WordPress 函数 get_post(post_id) 是否查询数据库?

hasOne/belongsToMany 或多对多

根据数组中的文本文件编号显示星级

将加密/解密函数从 PHP 转换为 NodeJS