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

WordPress+WooCommerce租车站点分时段定价总金额计算逻辑调整咨询

WooCommerce 租车站点分时段附加费计算方案

核心实现逻辑

不要用总租金除以租期的平均价设置单价,直接通过WooCommerce提供的原生钩子重写购物车金额计算规则,适配分月附加费的计算逻辑,全程无需修改WooCommerce核心文件,将代码添加到子主题functions.php文件或者自定义功能插件中即可生效。

具体实现步骤

    1. 先实现租期拆分逻辑,根据用户提交的起止租车时间,统计每个自然月对应的实际租赁天数
    1. 用woocommerce_before_calculate_totals钩子重写租车产品的总价计算,叠加对应月份的附加费
    1. 额外可选服务通过WooCommerce原生购物车附加费API叠加,无需额外适配逻辑
// 自定义租车产品总价计算规则
add_action( 'woocommerce_before_calculate_totals', 'custom_car_rental_price_calc', 10, 1 );
function custom_car_rental_price_calc( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;

    // 基础日租金,可后续改为读取产品自定义字段实现不同车型不同定价
    $base_daily_price = 17;
    // 分月附加费配置,可后续改为后台自定义配置项
    $monthly_extra_fee = [
        10 => 5.00,
        11 => 10.00
    ];

    // 读取用户提交的租期起止时间,替换为你实际的租期提交字段名
    $rental_start = WC()->session->get( 'user_selected_rental_start' );
    $rental_end = WC()->session->get( 'user_selected_rental_end' );
    if( empty($rental_start) || empty($rental_end) ) return;

    // 统计各自然月的租赁天数
    $start_datetime = new DateTime($rental_start);
    $end_datetime = new DateTime($rental_end);
    $day_interval = new DateInterval('P1D');
    $rental_period = new DatePeriod($start_datetime, $day_interval, $end_datetime);
    $month_days_count = [];
    foreach ($rental_period as $single_day) {
        $month_num = $single_day->format('n');
        $month_days_count[$month_num] = isset($month_days_count[$month_num]) ? $month_days_count[$month_num] + 1 : 1;
    }

    // 计算总租金
    $total_rental_amount = 0;
    foreach ($month_days_count as $month => $days) {
        $daily_total = $base_daily_price + (isset($monthly_extra_fee[$month]) ? $monthly_extra_fee[$month] : 0);
        $total_rental_amount += $daily_total * $days;
    }

    // 给购物车内的租车产品设置计算后的价格
    foreach ( $cart->get_cart() as $cart_item ) {
        // 替换为你自己的租车产品判断规则,比如按产品分类、产品ID判断
        if( has_term( 'rental-vehicle', 'product_cat', $cart_item['product_id'] ) ) {
            $cart_item['data']->set_price( $total_rental_amount / $cart_item['quantity'] );
        }
    }
}

可选租赁服务叠加方案

如果需要叠加保险、儿童座椅、GPS等额外可选服务,直接使用woocommerce_cart_calculate_fees钩子添加附加费即可,费用会自动叠加到总金额中,示例代码如下:

// 叠加租车可选服务费用
add_action( 'woocommerce_cart_calculate_fees', 'add_rental_extra_service_charge', 10, 1 );
function add_rental_extra_service_charge( $cart ) {
    // 读取用户选择的服务费用,替换为你实际的服务字段值
    $insurance_fee = WC()->session->get( 'selected_rental_insurance_fee' );
    $child_seat_fee = WC()->session->get( 'selected_child_seat_fee' );

    if( $insurance_fee > 0 ) {
        $cart->add_fee( '车辆保险', $insurance_fee );
    }
    if( $child_seat_fee > 0 ) {
        $cart->add_fee( '儿童安全座椅', $child_seat_fee );
    }
}

注意事项

  • 租期存储统一使用标准时间格式或者时间戳,提前做好时区适配,避免天数统计偏差
  • 基础租金、分月附加费建议配置为产品自定义字段,支持不同车型单独设置定价规则,无需硬编码
  • 所有用户提交的租期、服务选项都要做数据合法性校验,避免异常值导致计算错误

内容的提问来源于stack exchange,提问作者Bogdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:02