WordPress+WooCommerce租车站点分时段定价总金额计算逻辑调整咨询
WooCommerce 租车站点分时段附加费计算方案
核心实现逻辑
不要用总租金除以租期的平均价设置单价,直接通过WooCommerce提供的原生钩子重写购物车金额计算规则,适配分月附加费的计算逻辑,全程无需修改WooCommerce核心文件,将代码添加到子主题functions.php文件或者自定义功能插件中即可生效。
具体实现步骤
- 先实现租期拆分逻辑,根据用户提交的起止租车时间,统计每个自然月对应的实际租赁天数
- 用
woocommerce_before_calculate_totals钩子重写租车产品的总价计算,叠加对应月份的附加费
- 用
- 额外可选服务通过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
相关产品推荐
相关产品推荐

