购买新订阅后如何自动取消以前的 WooCommerce 订阅?

How to cancel previous WooCommerce subscription automatically when new subscription is purchased?

我正在构建一个会员网站,用户一次只能有一个有效订阅。我希望在购买任何新的 subscription/product 时,所有其他订阅都是 cancelled/expired 和所有相关的会员资格 deleted/cancelled。只有最新的订阅应与其随附的会员保持有效。

出于多种原因,我cannot/don不想使用内置功能来限制订阅。

有没有什么方法可以在感谢页面上,在当前用户和 cancel/expire 他们的所有活动订阅中剪断循环,除了刚刚购买的那个?

我已经检查过这个 post,它看起来很相似,但没有提供真正的解决方案 ()

非常感谢您的帮助

此致

自动回复,因为我在其他 SO post 的帮助下设法解决了我的问题。

基本上我通过降序 ID 获取所有活动订阅并在我的循环中设置一个计数器。如果它循环不止一次,那么它将订阅的状态设置为已取消。我在感谢页面中添加了它,以确保它仅在付款后触发...

add_action( 'woocommerce_thankyou', 'edf_cancel_previous_active_subscription' );
function edf_cancel_previous_active_subscription() {

    $no_of_loops = 0;
    $user_id = get_current_user_id();

    // Get all customer subscriptions
    $args = array(
        'subscription_status'       => 'active', 
        'subscriptions_per_page'    => -1,
        'customer_id'               => $user_id, 
        'orderby'                   => 'ID', 
        'order'                     => 'DESC'
    );
    $subscriptions = wcs_get_subscriptions($args);

    // Going through each current customer subscriptions
    foreach ( $subscriptions as $subscription ) {
        $no_of_loops = $no_of_loops + 1;

        if ($no_of_loops > 1){
            $subscription->update_status( 'cancelled' );
        } 
    }
}

不确定这是否是 "Wordpress/WooCommerce" 的实现方式,但我为此带来了我的其他编程语言经验。如果有人有更好的主意,请随时post。

我修改了下面提到的代码,因为如果新用户注册,它会取消所有订阅,尽管提到的代码对现有用户可以正常工作,但是当新用户注册时,所有用户的所有订阅都将被取消 因此我开发了代码

    function edf_cancel_previous_active_subscription() {
    
        $no_of_loops = 0;
        $user_id = get_current_user_id();
       
        // If is an existing user
        if($user_id!=0)
        {
        $args = array(
            'subscription_status'       => 'active', 
            'subscriptions_per_page'    => -1,
            'customer_id'               => $user_id, 
            'orderby'                   => 'ID', 
            'order'                     => 'DESC'
        );
        $subscriptions = wcs_get_subscriptions($args);
        // Going through each current customer subscriptions
         foreach ( $subscriptions as $subscription ) {
             $no_of_loops = $no_of_loops + 1;
//Cancel previous subscription of user applying for new subscription
             if ($no_of_loops = 1) {
                 $subscription->update_status( 'pending-cancel' );
             }
         }
     }
    }
//when checkout is in progress previous subscriptions will be cancelled and after successful checkout the subscription for which checkout process was initiated becomes active
    add_action('woocommerce_before_checkout_process', 'edf_cancel_previous_active_subscription');