如何在WordPress中用add_filter重写GamiPress的$points_to_award值?
解决GamiPress WooCommerce积分计算重写问题
你的代码无法正常工作主要有以下几个问题:
- 没有接收过滤器传递的全部参数,导致无法获取订单ID等关键数据
- 直接使用未定义的
$order和$ratio变量 - 未指定过滤器的参数数量,导致额外参数无法传递到自定义函数
修正后的代码如下:
function my_custom_function($points_to_award, $user_id, $points_type, $order_id, $percent) { // 获取WooCommerce订单对象 $order = wc_get_order($order_id); // 检查订单是否有效 if (!$order) { return $points_to_award; } // 定义积分比例(这里替换成你需要的比例值,比如10代表10%) $ratio = 10; // 计算实际要发放的积分:(订单总额 - 运费) * 比例/100,最后转成整数 $points_to_award = (int) (($order->get_total() - $order->get_shipping_total()) * ($ratio / 100)); return $points_to_award; } // 最后一个参数5表示接收5个额外参数(加上第一个共6个,对应原过滤器的参数数量) add_filter( 'gamipress_wc_points_per_purchase_total_points_to_award', 'my_custom_function', 10, 5 );
关键修改说明:
- 补全函数参数:将原函数的单个参数扩展为过滤器传递的全部参数,这样能获取到
$order_id来调取订单对象 - 获取订单对象:使用
wc_get_order($order_id)获取合法的WooCommerce订单对象,避免直接使用未定义的$order - 定义积分比例:明确赋值
$ratio变量,替换成你实际需要的积分比例 - 指定过滤器参数数量:在
add_filter的第四个参数传入5,告诉WordPress这个自定义函数需要接收5个额外参数(加上默认的第一个参数,总共6个,和原apply_filters的参数数量匹配) - 强制转成整数:和原插件的处理逻辑一致,将计算结果转为整数,避免非整数积分的问题
内容的提问来源于stack exchange,提问作者Artan
相关产品推荐
相关产品推荐

