Woocommerce自定义插件产品计价问题:购物车未计入材料与饰面成本
WooCommerce购物车缺失材料/饰面成本计算的解决方案
问题核心
前端能正确计算含材料、饰面的价格,但添加到购物车后丢失这两部分成本,本质是自定义参数未被传递并保存到购物车项目中,导致购物车计算时无法获取$material_price和$finish_price。
修复步骤
1. 保存自定义参数到购物车
使用woocommerce_add_cart_item_data钩子,将材料、饰面的价格/选项数据存入购物车项目元数据:
add_filter('woocommerce_add_cart_item_data', 'save_custom_product_options_to_cart', 10, 3); function save_custom_product_options_to_cart($cart_item_data, $product_id, $variation_id) { // 保存材料价格(根据你的表单name调整,这里假设是material) if(isset($_POST['material']) && !empty($_POST['material'])) { $cart_item_data['material_price'] = floatval($_POST['material']); // 可选:保存材料名称,用于购物车显示 $cart_item_data['material_name'] = sanitize_text_field($_POST['material_name']); } // 保存饰面价格 if(isset($_POST['finish']) && !empty($_POST['finish'])) { $cart_item_data['finish_price'] = floatval($_POST['finish']); $cart_item_data['finish_name'] = sanitize_text_field($_POST['finish_name']); } // 添加唯一键,确保同产品不同选项视为独立购物项 if(!empty($cart_item_data['material_price']) || !empty($cart_item_data['finish_price'])) { $cart_item_data['unique_key'] = md5(microtime() . rand()); } return $cart_item_data; }
2. 在购物车显示自定义选项(可选)
用woocommerce_get_item_data钩子,让用户在购物车中看到所选的材料/饰面:
add_filter('woocommerce_get_item_data', 'display_custom_cart_options', 10, 2); function display_custom_cart_options($item_data, $cart_item) { if(isset($cart_item['material_name'])) { $item_data[] = ['key' => '材料', 'value' => $cart_item['material_name']]; } if(isset($cart_item['finish_name'])) { $item_data[] = ['key' => '饰面', 'value' => $cart_item['finish_name']]; } return $item_data; }
3. 重新计算购物车价格
通过woocommerce_before_calculate_totals钩子,取出保存的参数重新计算总价:
add_action('woocommerce_before_calculate_totals', 'recalculate_cart_with_custom_costs', 10, 1); function recalculate_cart_with_custom_costs($cart) { if(is_admin() && !defined('DOING_AJAX')) return; foreach($cart->get_cart() as $cart_item_key => $cart_item) { // 基础价格(产品原价) $base_price = $cart_item['data']->get_price(); // 取出材料/饰面价格 $material_cost = isset($cart_item['material_price']) ? $cart_item['material_price'] : 0; $finish_cost = isset($cart_item['finish_price']) ? $cart_item['finish_price'] : 0; // 取出你之前计算的面积值(需确保已存入购物车,比如custom_area) $area = isset($cart_item['custom_area']) ? floatval($cart_item['custom_area']) : 0; $quantity = $cart_item['quantity']; // 按你的逻辑计算总价(示例:(基础价+材料+饰面)*面积*数量) $total_price = ($base_price + $material_cost + $finish_cost) * $area * $quantity; // 设置购物项单价(WooCommerce按单价计算,所以除以数量) $cart_item['data']->set_price($total_price / $quantity); } }
额外检查
- 确保产品页表单中,材料/饰面的输入字段
name属性与代码中的$_POST键一致(比如name="material")。 - 如果材料/饰面是下拉选项,需确保选项
value为对应价格,或在save_custom_product_options_to_cart中根据选项ID匹配价格。
内容的提问来源于stack exchange,提问作者dltp
相关产品推荐
相关产品推荐

