You need to enable JavaScript to run this app. WooCommerce 如何获取选中商品变体价格并叠加自定义附加费
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce 如何获取选中商品变体价格并叠加自定义附加费

问题原因分析

  • 你代码中调用的get_price_html()返回的是带货币符号、HTML格式的价格字符串,本身不是数值类型,直接做算术运算时会被强制转为0,这是$var_price始终为0的核心原因
  • 可变产品场景下不需要通过父产品查询变体价格,woocommerce_add_cart_item_data钩子已经直接传入了用户选中的$variation_id,直接获取变体对象读取价格即可
  • 仅把自定义价格存入cart_item_data不会实际生效,还需要额外挂载购物车总价计算的钩子,才能把加价规则应用到订单结算流程

完整可运行代码

// 保存复选框勾选状态到购物车项目数据
add_filter( 'woocommerce_add_cart_item_data', 'save_addon_card_checkbox_to_cart', 10, 3 );
function save_addon_card_checkbox_to_cart( $cart_item_data, $product_id, $variation_id ) {
    if( ! empty( $_POST['addon-card'] ) ) {
        // 存储附加项勾选标记
        $cart_item_data['addon_card_applied'] = true;
        // 生成唯一键避免勾选和未勾选附加项的同款商品被合并
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}

// 购物车总价计算阶段应用30美元加价
add_action( 'woocommerce_before_calculate_totals', 'apply_addon_card_surcharge', 10, 1 );
function apply_addon_card_surcharge( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    foreach ( $cart->get_cart() as $cart_item ) {
        // 仅对勾选了附加项的商品加价
        if( isset( $cart_item['addon_card_applied'] ) && $cart_item['addon_card_applied'] ) {
            // 自动适配简单商品/可变商品,直接读取当前选中商品的原始价格
            $original_price = $cart_item['data']->get_price();
            $cart_item['data']->set_price( $original_price + 30 );
        }
    }
}

代码说明

  • 可变产品场景下$cart_item['data']直接对应用户选中的变体对象,调用get_price()就能拿到当前变体的真实售价,不需要额外调用父产品的变体查询方法
  • 价格计算逻辑统一在woocommerce_before_calculate_totals钩子中执行,兼容WooCommerce默认的促销、优惠券、税费等价格规则,不会和其他插件功能冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 04:24:03