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

