WooCommerce 订阅 - 自动完成续订订单和订阅状态
WooCommerce Subscriptions - Automatically complete renewal orders and Subscription status
我在一个使用 WooCommerce 订阅和 WooCommerce 会员资格的网站上工作。它出售每年续订的订阅。
唯一使用的支付网关是支票(重命名为通过发票支付),因此所有续订都是手动续订。发票会发送给客户(在 WooCommerce 之外),店主在付款后在管理员中将订单标记为已完成。
订阅状态与最新订单状态相关联:
如果订单已完成,则sub已激活
如果订单处于挂起、处理中、暂停等状态,则子订单处于暂停状态。
由于发票是通过外部会计系统发送和处理的,客户希望自动完成续订订单,这样用户的会员访问权限就不会中断。
我看过类似的问题,例如这里,我 运行 遇到了类似的问题。
Change subscription status to active based on order id WooCommerce
我已经测试了挂钩 woocommerce_new_order
并且可以看到它针对所有订单触发,包括续订。
使用 wcs_get_subscriptions_for_order()
,可以将 'renewal'
作为 order_type
传递,以测试给定订单是续订订单还是新客户。
我有一小段代码来检查新订单,如果适用则更新它,然后更新订阅状态。但是,似乎我的第一个 if
块被跳过了——它总是运行到 else
块中的代码。
此外,如果我将更新订单和子状态的行移动到 else
块(因此它确实会更新所有订单),订单状态会更新但子保持为暂停状态。
我猜肯定有一些触发器,如果从管理员更新订单或通过未触发的付款更新订单,通常会调用该触发器,但我无法从文档中看到它会是什么。
任何人都可以告诉我这里哪里出了问题吗?
<?php
/**
* Autocomplete Renewal Orders
*/
function ctz_autocomplete_renewal_order($order_id) {
/**
* Check if the order is associated with a subscription
*
* WC Subscriptions gives us a function to obtain the related orders for a subscription in an array. The second parameter allows us to retrieve only renewal orders.
*
* We can use this function to check if the given order ID is for a new customer order or an existing customer's renewal.
*
* If this array returns blank, it's a first order, and should be skipped over.
*/
// Get related Subscriptions
$subscriptions = wcs_get_subscriptions_for_order($order_id, array('order_type' => 'renewal'));
if(is_array($subscriptions) && !empty($subscriptions) ) :
// This is a renewal order - change the status
$order = wc_get_order($order_id);
$order->update_status( 'completed');
$order->save();
// Check and update the subscription status
activate_subscriptions_for_order($order);
// Log the change
$message = $order_id . " Renewal automatically completed.";
ctz_custom_logs('autorenewals', $message);
else :
// This is a new order - leave unchanged
$message = $order_id . " Initial order - status unchanged.";
ctz_custom_logs('autorenewals', $message);
endif;
}
add_action('woocommerce_new_order', 'ctz_autocomplete_renewal_order', 11, 1);
?>
仅供参考,我使用的日志记录功能仅用于调试并将给定消息记录到文件中。
提前致谢。
add_filter('wcs_renewal_order_created', 'wcs_after_create_renewal_order', 10, 2);
function wcs_after_create_renewal_order($renewal_order, $subscription) {
// Set the current renewal order as completed.
$renewal_order->update_status('completed');
$renewal_order->add_order_note( __( 'Renewal automatically processed' ) );
// Set the corresponding subscription as active.
$subscription->update_status('active');
return $renewal_order;
}
挂钩 wcs_renewal_order_created
只有在创建续订订单后才会触发。只需将上面的代码片段添加到您的活动主题 functions.php
文件中。
我在一个使用 WooCommerce 订阅和 WooCommerce 会员资格的网站上工作。它出售每年续订的订阅。
唯一使用的支付网关是支票(重命名为通过发票支付),因此所有续订都是手动续订。发票会发送给客户(在 WooCommerce 之外),店主在付款后在管理员中将订单标记为已完成。
订阅状态与最新订单状态相关联:
如果订单已完成,则sub已激活
如果订单处于挂起、处理中、暂停等状态,则子订单处于暂停状态。
由于发票是通过外部会计系统发送和处理的,客户希望自动完成续订订单,这样用户的会员访问权限就不会中断。
我看过类似的问题,例如这里,我 运行 遇到了类似的问题。
Change subscription status to active based on order id WooCommerce
我已经测试了挂钩 woocommerce_new_order
并且可以看到它针对所有订单触发,包括续订。
使用 wcs_get_subscriptions_for_order()
,可以将 'renewal'
作为 order_type
传递,以测试给定订单是续订订单还是新客户。
我有一小段代码来检查新订单,如果适用则更新它,然后更新订阅状态。但是,似乎我的第一个 if
块被跳过了——它总是运行到 else
块中的代码。
此外,如果我将更新订单和子状态的行移动到 else
块(因此它确实会更新所有订单),订单状态会更新但子保持为暂停状态。
我猜肯定有一些触发器,如果从管理员更新订单或通过未触发的付款更新订单,通常会调用该触发器,但我无法从文档中看到它会是什么。
任何人都可以告诉我这里哪里出了问题吗?
<?php
/**
* Autocomplete Renewal Orders
*/
function ctz_autocomplete_renewal_order($order_id) {
/**
* Check if the order is associated with a subscription
*
* WC Subscriptions gives us a function to obtain the related orders for a subscription in an array. The second parameter allows us to retrieve only renewal orders.
*
* We can use this function to check if the given order ID is for a new customer order or an existing customer's renewal.
*
* If this array returns blank, it's a first order, and should be skipped over.
*/
// Get related Subscriptions
$subscriptions = wcs_get_subscriptions_for_order($order_id, array('order_type' => 'renewal'));
if(is_array($subscriptions) && !empty($subscriptions) ) :
// This is a renewal order - change the status
$order = wc_get_order($order_id);
$order->update_status( 'completed');
$order->save();
// Check and update the subscription status
activate_subscriptions_for_order($order);
// Log the change
$message = $order_id . " Renewal automatically completed.";
ctz_custom_logs('autorenewals', $message);
else :
// This is a new order - leave unchanged
$message = $order_id . " Initial order - status unchanged.";
ctz_custom_logs('autorenewals', $message);
endif;
}
add_action('woocommerce_new_order', 'ctz_autocomplete_renewal_order', 11, 1);
?>
仅供参考,我使用的日志记录功能仅用于调试并将给定消息记录到文件中。
提前致谢。
add_filter('wcs_renewal_order_created', 'wcs_after_create_renewal_order', 10, 2);
function wcs_after_create_renewal_order($renewal_order, $subscription) {
// Set the current renewal order as completed.
$renewal_order->update_status('completed');
$renewal_order->add_order_note( __( 'Renewal automatically processed' ) );
// Set the corresponding subscription as active.
$subscription->update_status('active');
return $renewal_order;
}
挂钩 wcs_renewal_order_created
只有在创建续订订单后才会触发。只需将上面的代码片段添加到您的活动主题 functions.php
文件中。