购买新订阅后如何自动取消以前的 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');
我正在构建一个会员网站,用户一次只能有一个有效订阅。我希望在购买任何新的 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');