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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:55:05