WooCommerce Subscriptions代码修复:取消订阅76时同步取消其他订阅
WooCommerce 订阅联动取消修复方案
原代码的核心问题是硬编码固定订阅ID,只能处理特定的两个订阅,不符合“取消用户所有其他订阅”的需求,同时调用的取消方法也不够规范。以下是修复后的代码:
add_action('woocommerce_subscription_status_updated', 'custom_cancel_user_other_subscriptions', 10, 3); function custom_cancel_user_other_subscriptions($subscription_id, $new_status, $old_status) { // 仅当订阅从非取消状态变为"已取消"时执行 if ($new_status !== 'cancelled' || $old_status === 'cancelled') { return; } // 获取当前订阅对象 $current_subscription = wcs_get_subscription($subscription_id); if (!$current_subscription) { return; } // 获取订阅所属用户ID $user_id = $current_subscription->get_user_id(); if (!$user_id) { return; } // 查询该用户的所有有效订阅(活跃/暂停状态) $user_subscriptions = wcs_get_subscriptions(array( 'user_id' => $user_id, 'post_status' => array('wc-active', 'wc-on-hold') )); // 遍历取消除当前订阅外的所有订阅 foreach ($user_subscriptions as $subscription) { if ($subscription->get_id() !== $subscription_id) { // 更新状态为已取消并添加操作备注 $subscription->update_status('cancelled', '联动取消:用户主动取消了其他订阅'); } } }
修复说明:
- 移除硬编码ID限制,改为基于用户ID批量处理,适配所有用户的订阅场景
- 增加状态校验:避免重复触发取消逻辑,仅在订阅状态从有效变为取消时执行
- 使用WooCommerce官方查询函数获取用户订阅,确保兼容性
- 采用官方推荐的
update_status()方法修改订阅状态,并添加操作备注,便于后台追溯 - 增加多层有效性判断,提升代码稳定性
内容的提问来源于stack exchange,提问作者Rafay King
相关产品推荐
相关产品推荐

