
在woocommerce订阅(woocommerce subscriptions)插件的实际应用中,商家可能希望限制用户在任何给定时间只能拥有一份活跃订阅。例如,一个会员网站可能只提供不同级别的会员订阅,用户在成为其中一个级别的会员后,不应再购买另一个独立的会员订阅。然而,一个常见的挑战是,当实施这种限制时,往往会意外地阻止用户对其现有订阅进行升级或降级操作。本教程将提供一个解决方案,在限制用户仅拥有一个活跃订阅的同时,允许订阅的切换功能(升级或降级)。
最初的限制逻辑通常是通过woocommerce_add_to_cart_validation过滤器实现,检查用户是否已有活跃订阅。如果存在,则阻止任何新的订阅产品加入购物车。这种简单粗暴的逻辑虽然实现了“单活跃订阅”的目标,但也误伤了订阅切换的场景,因为升级或降级本质上也是将新的订阅产品加入购物车。
解决方案的关键在于,在检查用户是否已有活跃订阅的基础上,增加一个判断:当前尝试加入购物车的订阅产品,是否是用户现有活跃订阅所对应的产品。如果是,则允许加入购物车(因为这通常是订阅切换的流程);如果不是,且用户已有活跃订阅,则阻止其购买新的独立订阅。
以下是经过优化和测试的代码片段,您可以将其添加到您主题的functions.php文件或自定义插件中:
add_filter('woocommerce_add_to_cart_validation', 'check_num_of_subscriptions', 10, 2);
/**
* 验证购物车中订阅产品的添加,确保用户只拥有一份活跃订阅,但允许升级/降级。
*
* @param bool $valid 当前验证结果。
* @param int $product_id 尝试添加到购物车的商品ID。
* @return bool
*/
function check_num_of_subscriptions( $valid, $product_id ){
$product_to_add = wc_get_product( $product_id );
// 仅对订阅产品或可变订阅产品进行检查
if ($product_to_add instanceof WC_Product_Subscription || $product_to_add instanceof WC_Product_Variable_Subscription){
// 检查用户是否已有活跃订阅
if ( has_active_subscription() ) {
// 如果用户已有活跃订阅,则进一步检查尝试添加的产品是否是其现有订阅的一部分
// 如果不是现有订阅的一部分,则阻止添加;如果是,则允许(用于升级/降级)
if ( ! has_woocommerce_subscription('', $product_id, '') ) {
wc_clear_notices();
wc_add_notice(__('您已经拥有一个活跃的订阅。如需更改,请访问您的账户页面进行升级或降级。', 'woocommerce'), 'error');
return false;
} else {
return true; // 允许,因为这是现有订阅的切换(升级/降级)
}
} else {
return true; // 用户没有活跃订阅,允许购买
}
}
return $valid; // 非订阅产品,直接返回原验证结果
}
/**
* 检查当前用户是否拥有任何活跃的订阅。
*
* @return bool
*/
function has_active_subscription(){
$user_id = get_current_user_id();
if ( ! $user_id ) {
return false; // 未登录用户,不视为有活跃订阅
}
$active_subscriptions = get_posts(array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $user_id,
'post_type' => 'shop_subscription',
'post_status' => 'wc-active' // 查找状态为 'wc-active' 的订阅
));
return ! empty($active_subscriptions);
}
/**
* 检查特定用户是否拥有特定产品的订阅。
* 此函数利用 WooCommerce Subscriptions 提供的 API。
*
* @param int $the_user_id 要检查的用户ID,如果为空则使用当前用户。
* @param int $the_product_id 要检查的订阅产品ID。
* @param string $the_status 要检查的订阅状态,例如 'active'。如果为空则检查任何状态。
* @return bool
*/
function has_woocommerce_subscription($the_user_id, $the_product_id, $the_status) {
$current_user = wp_get_current_user();
if (empty($the_user_id)) {
$the_user_id = $current_user->ID;
}
// 确保 WooCommerce Subscriptions 插件已激活且相关类可用
if ( class_exists('WC_Subscriptions_Manager') && WC_Subscriptions_Manager::user_has_subscription( $the_user_id, $the_product_id, $the_status) ) {
return true;
}
return false;
}check_num_of_subscriptions( $valid, $product_id ):
has_active_subscription():
has_woocommerce_subscription($the_user_id, $the_product_id, $the_status):
通过以上代码和详细解释,您将能够精确控制WooCommerce商店中的订阅行为,既能强制用户只能拥有一份活跃订阅,又能灵活地支持订阅的升级和降级,从而提升用户体验和业务逻辑的严谨性。
以上就是WooCommerce订阅管理:限制单活跃订阅并支持升级/降级的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号