如何判断订阅订单是切换/父订单?优化WooCommerce代码
解决方案
WooCommerce Subscriptions 提供了专门的函数来识别切换订单(Switch Orders),我们可以直接用该函数精准排除这类订单,同时保留所有包含目标订阅产品的父订单(无论订单总额是否为0)。
修正后的代码如下:
function get_product_data( $customer_data, $order ) { // 确保WooCommerce Subscriptions相关函数可用,避免插件未启用时报错 if ( ! function_exists( 'wcs_order_is_switch' ) ) { return $customer_data; } foreach ( $order->get_items() as $item ) { // 判断条件:匹配目标订阅产品ID,且当前订单不是切换订单 if ( 12496 === $item->get_product_id() && ! wcs_order_is_switch( $order ) ) { $customer_data['journey_sub_variation'] = $item->get_variation_id(); // 改用官方方法获取变体ID,兼容性更好 } } return $customer_data; } add_filter( 'wpf_woocommerce_customer_data', 'get_product_data', 10, 2 );
关键改动说明:
- 移除了基于订单总额的判断,改用
wcs_order_is_switch( $order )直接识别切换订单,彻底解决免费试用父订单被误排除的问题 - 添加
function_exists检查,避免WooCommerce Subscriptions未启用时触发致命错误 - 将
$item['variation_id']替换为官方方法$item->get_variation_id(),符合WooCommerce代码规范,适配后续版本更新
补充说明:
如果需要额外明确锁定父订单,可以结合wcs_is_parent_order( $order )函数扩展判断逻辑,但原需求仅需排除切换订单,上述代码已完全满足——切换订单不会被标记为父订单,而所有父订单(包括免费试用类型)都会被保留执行操作。
内容的提问来源于stack exchange,提问作者Marlon
相关产品推荐
相关产品推荐

