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
相关产品推荐
相关产品推荐

