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

替换WC_Cart类get_discounted_price函数逻辑无效,求排查错误

问题分析与解决方案

你遇到的问题核心是用错了钩子类型——get_discounted_price对应的是过滤器(filter)而非动作(action),所以你应该用add_filter而非add_action来替换它的逻辑。

为什么会这样?

WooCommerce的WC_Cart::get_discounted_price()方法内部是通过apply_filters( 'woocommerce_cart_get_discounted_price', ... )来允许修改价格的。动作(action)仅用于执行一段代码,不会返回值;而过滤器(filter)专门用于修改数据并返回结果,这就是你的代码没生效的关键原因。

修正后的代码示例

把你的代码改成这样:

function get_discounted_price_new( $discounted_price, $price, $values, $cart ) {
    // 这里写你的自定义逻辑,比如修改折扣价格
    // 示例:强制折扣为原价的8折
    $discounted_price = $price * 0.8;
    
    return $discounted_price; // 必须返回修改后的值,过滤器才会生效
}
add_filter( 'woocommerce_cart_get_discounted_price', 'get_discounted_price_new', 10, 4 );

额外注意事项

  • 参数顺序与数量:要确保你的自定义函数参数和过滤器的参数完全匹配,woocommerce_cart_get_discounted_price的参数顺序是$discounted_price, $price, $values, $cart,并且要在add_filter的第四个参数指定接收的参数数量(这里是4)。
  • 优先级设置:第三个参数是优先级,默认10,如果你的逻辑需要覆盖其他插件的修改,可以把这个值调大(比如20),确保你的函数最后执行。
  • 加载时机:确保你的代码是在WooCommerce加载之后执行的,子主题的functions.php通常没问题,但如果还是有问题,可以把代码包裹在woocommerce_init动作里:
add_action( 'woocommerce_init', function() {
    function get_discounted_price_new( $discounted_price, $price, $values, $cart ) {
        // 你的自定义逻辑
        return $discounted_price;
    }
    add_filter( 'woocommerce_cart_get_discounted_price', 'get_discounted_price_new', 10, 4 );
} );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:18:06