WC Bookings过滤器报错:参数数量不足问题排查求助
woocommerce_bookings_calculated_booking_cost参数不足的问题 这个错误的核心原因很明确:WordPress默认只会给过滤器函数传递1个参数,而你定义的函数期望接收3个参数,但你在调用add_filter的时候没有明确告诉WordPress要传递更多参数,所以就出现了参数数量不匹配的致命错误。
问题细节拆解
你注册过滤器的代码是:
add_filter( 'woocommerce_bookings_calculated_booking_cost', 'foobar_price_changer' );
WordPress的add_filter函数有四个参数,其中第四个参数$accepted_args默认值是1,意思是只传递1个参数给你的回调函数。而woocommerce_bookings_calculated_booking_cost过滤器本身确实会传递3个参数($booking_cost、$product、$data),但因为你没指定$accepted_args,WP只传了第一个参数,导致你的函数收到1个参数却期望3个,直接触发ArgumentCountError。
另外注意下报错里的函数名是sbnb_modify_wc_bookings_price(),但你代码里的函数是foobar_price_changer,如果这是笔误的话,也要确保函数名完全一致,不然也会有问题。
修正后的代码
只需要在add_filter里加上第四个参数3,告诉WordPress要传递3个参数给你的回调函数:
function foobar_price_changer( $booking_cost, $product, $data ) { // 这里可以写你的价格修改逻辑,比如: // $booking_cost = $booking_cost * 1.1; // 加价10% return $booking_cost; } // 第四个参数3表示接收3个参数,第三个参数10是默认优先级(可选) add_filter( 'woocommerce_bookings_calculated_booking_cost', 'foobar_price_changer', 10, 3 );
原理补充
WordPress的钩子(过滤器和动作)机制里,当你注册回调函数时,如果钩子本身会传递多个参数,你必须通过add_filter/add_action的第四个参数声明你要接收的参数数量,否则WP只会传递第一个参数。这是很多新手容易踩的坑,记住这个规则就可以避免类似的参数错误了。
内容的提问来源于stack exchange,提问作者errorous

