如何修改Enhancer for WooCommerce Subscription试用限制逻辑,校验全量用户订阅产品
实现方案
可以通过修改代码中的产品ID校验、缓存键逻辑实现全量产品的试用资格校验,具体修改点如下:
- 修改缓存键逻辑:原缓存按「用户ID+当前产品ID」存储校验结果,因为现在是全局校验,无需区分产品,直接按用户ID存储全局试用状态即可
- 修改订阅校验规则:删除原有判断订阅是否包含当前产品的逻辑,只要用户名下任意订阅使用过试用资格,就直接返回0(不提供新试用)
- 可选调整:如果你希望所有产品都强制走全局试用限制,可直接删除原代码中两个产品级配置的判断分支,无需每个产品单独开启试用限制开关
修改后完整代码
public static function limit_trial( $trial_length, $product ) { if ( $trial_length <= 0 ) { return $trial_length ; } $user_id = get_current_user_id() ; if ( ! $user_id ) { return $trial_length ; } // 缓存键改为全局用户维度,不再区分产品ID if ( isset( self::$onetime_trial_cache[ $user_id ]['global_trial_used'] ) ) { return self::$onetime_trial_cache[ $user_id ]['global_trial_used'] ? 0 : $trial_length ; } if ( $product->is_type( 'variation' ) ) { $parent_product = wc_get_product( $product->get_parent_id() ) ; } else { $parent_product = $product ; } // 若不需要保留原产品级配置开关,可删除以下两个if判断分支 if ( 'no' !== self::get_product_limitation( $parent_product ) ) { self::$onetime_trial_cache[ $user_id ]['global_trial_used'] = false ; return $trial_length ; } if ( 'yes' !== get_post_meta( $parent_product->get_id(), '_enr_limit_trial_to_one', true ) ) { self::$onetime_trial_cache[ $user_id ]['global_trial_used'] = false ; return $trial_length ; } $subscriptions = wcs_get_users_subscriptions( $user_id ) ; foreach ( $subscriptions as $subscription ) { // 删除产品ID匹配逻辑,只要任意订阅有试用记录就触发限制 if ( '' !== $subscription->get_trial_period() || 0 !== $subscription->get_time( 'trial_end' ) ) { self::$onetime_trial_cache[ $user_id ]['global_trial_used'] = true ; return 0 ; } } self::$onetime_trial_cache[ $user_id ]['global_trial_used'] = false ; return $trial_length ; }
注意事项
- 修改前请备份原有代码,建议先在测试环境验证逻辑符合预期后再上线
- 若你后续需要给特定产品开放例外的试用权限,可在校验逻辑中增加产品ID白名单判断
内容的提问来源于stack exchange,提问作者Andreas EBM
相关产品推荐
相关产品推荐

