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

WooCommerce:如何获取包含Product Addons的产品最终价格?

解决WooCommerce产品附加组件价格无法正确获取的问题

首先得明确:woocommerce_product_get_price这个钩子本身是针对基础产品价格的,而产品附加组件的价格是用户选择后才动态计算的,属于购物车项目层面的变动,所以直接用产品对象的get_regular_price()肯定拿不到附加组件的费用。下面给你几个可行的解决思路:

方案1:改用购物车项目相关的钩子(最推荐)

附加组件的价格会在产品添加到购物车后,被自动计入购物车项目的总价里。所以我们应该针对购物车的最终价格来调整,而不是在产品基础价格的钩子上操作。

示例代码如下:

function alter_cart_price_by_user_role($price, $cart_item, $cart_item_key) {
    // 获取当前用户的角色
    $user = wp_get_current_user();
    $user_roles = $user->roles;
    
    // 举个例子:给"wholesale"(批发商)角色打8折
    if (in_array('wholesale', $user_roles)) {
        // $cart_item['line_total']已经包含了用户选择的附加组件费用
        $adjusted_total = $cart_item['line_total'] * 0.8;
        // 用WooCommerce自带的函数格式化价格显示
        $price = wc_price($adjusted_total);
    }
    
    return $price;
}
add_filter('woocommerce_cart_item_subtotal', 'alter_cart_price_by_user_role', 10, 3);

这个方法的优势在于,不管用户选了什么附加组件,$cart_item['line_total']都是已经计算好的完整总价,基于它调整就能保证购物车和结账页的价格准确。

方案2:手动计算默认附加组件价格(仅适用于固定默认选项场景)

如果你的附加组件有固定的默认选项,且不需要考虑用户自定义选择的情况,可以在产品价格钩子中手动获取附加组件的默认价格并叠加:

function alter_price_by_user_role($price, $product) {
    $user = wp_get_current_user();
    $user_roles = $user->roles;
    
    if (in_array('wholesale', $user_roles)) {
        // 获取当前产品的所有附加组件设置
        $addons = wc_get_product_addons($product->get_id());
        $default_addon_total = 0;
        
        // 遍历附加组件,计算默认选项的总价
        foreach ($addons as $addon) {
            foreach ($addon['options'] as $option) {
                if (!empty($option['default']) && $option['default'] === '1') {
                    $default_addon_total += floatval($option['price']);
                }
            }
        }
        
        // 基础原价 + 默认附加组件价,再应用折扣
        $base_price = floatval($product->get_regular_price());
        $total_price = ($base_price + $default_addon_total) * 0.8;
        $price = $total_price;
    }
    
    return $price;
}
add_filter('woocommerce_product_get_price', 'alter_price_by_user_role', 10, 2);

注意:这个方法只能处理有默认选项的附加组件,如果用户选了非默认选项,计算结果就会不准确,所以仅适合特定场景。

方案3:使用Product Addons的专用钩子分别调整

WooCommerce Product Addons本身提供了调整附加组件价格的钩子,你可以结合基础产品价格钩子,分别调整基础价和附加组件价:

// 调整基础产品价格
function alter_base_price_by_role($price, $product) {
    $user = wp_get_current_user();
    $user_roles = $user->roles;
    
    if (in_array('wholesale', $user_roles)) {
        $price = floatval($product->get_regular_price()) * 0.8;
    }
    return $price;
}
add_filter('woocommerce_product_get_price', 'alter_base_price_by_role', 10, 2);

// 调整附加组件的价格
function alter_addon_price_by_role($addon_price, $addon, $option, $product) {
    $user = wp_get_current_user();
    $user_roles = $user->roles;
    
    if (in_array('wholesale', $user_roles)) {
        $addon_price = floatval($option['price']) * 0.8;
    }
    return $addon_price;
}
add_filter('woocommerce_product_addons_adjust_price', 'alter_addon_price_by_role', 10, 4);

这个方法适合需要分别控制基础产品折扣和附加组件折扣的场景,最终总价会自动叠加两者的调整后价格。

总结一下,最稳妥的是方案1,它直接基于购物车中已经计算好的完整总价调整,能适配所有用户选择的附加组件情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:08:09