我对WooCommerce订阅的结束日期有一个问题。我在这里发现主题Woocommerce订阅更改截止日期然而,我们这里的情况有点不同,但这个话题很有帮助。
我们使用比例(每月10日)设置,以便同时创建续订订单(每个月)。这工作得很好。此外,我们使用WooCommerce会员资格,以便客户可以访问特定的会员内容。WooCommerce订阅会根据最后一次付款日期自动设置结束日期。我们有一个不同期限的订阅变体产品。(3、6、12个月)
这样,我们就有了以下问题:当客户今天订购2021年3月4日(日/月/年)的订阅时,系统将创建一个订阅,第一笔付款为2021年3月10日。在这种情况下,结束日期将是2021年6月10日。(2021年3月10日+ 3个月)但我们希望,结束日期将是2021年6月4日(开始日期+3个月),而不是2021年6月10日。
为此,我们尝试根据开始日期(订单日期)和特定的订阅变体(3)计算订阅结束日期。6或12个月)。
例子:
- 2021年3月4日(订购日期&创建初始父订单) 10/03/2021(第一批货)
- 10/04/2021(第2批)
- 10/05/2021(第3批)
=比;结束日期应该是04/06/2021而不是10/06/2021
其他例子:
- 20/03/2021(订单日期&创建初始父订单)
- 10/04/2021(第一批货)
- 10/05/2021(第2批)
- 10/06/2021(第3批)
=比;结束日期应该是20/06/2021而不是10/07/2021
当前方法我们尝试在这里使用这些动作钩子:https://docs.woocommerce.com/document/subscriptions/develop/action-reference/
在此当前状态下,结束日期不会更改。我现在不确定是什么问题。我想我以正确的方式访问了结束日期,但是在创建订阅后它没有改变。
add_action( 'woocommerce_checkout_subscription_created', 'recalc_subscription_end_date' );
function recalc_subscription_end_date ($order, $subscription) {
if ( function_exists( 'wcs_order_contains_subscription' ) ) {
if ( wcs_order_contains_subscription( $order->ID ) ) {
// Set subscription end date based on subscription variation
$end_date = date('Y-m-d H:i:s',strtotime("+12 months", strtotime($start_date)));
$dates_to_update = array();
$dates_to_update['end'] = $end_date;
$subscription->update_dates($dates_to_update);
$subscription->update_dates( array(
'end' => $end_date,
) );
$subscription->save();
}
$return;
}
}
更新:通过@LoicTheAztec的新信息,我在日志中得到以下错误。目前+12个月的计算是硬编码的每一个变化。我如何才能访问数组的所有3个变化?
我们的变异ID's: 3个月11903,6个月11904,12个月11905,
[04-Mar-2021 16:43:10 UTC] PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function recalc_subscription_end_date(), 1 passed in /home/testsystem/www/test887854.ch/cbctest/wp-includes/class-wp-hook.php on line 289 and exactly 2 expected in /home/testsystem/www/test887854.ch/cbctest/wp-content/plugins/code-snippets/php/snippet-ops.php(446) : eval()'d code:2
Stack trace:
#0 /home/testsystem/www/test887854.ch/cbctest/wp-includes/class-wp-hook.php(289): recalc_subscription_end_date(Object(WC_Subscription))
#1 /home/testsystem/www/test887854.ch/cbctest/wp-includes/class-wp-hook.php(311): WP_Hook->apply_filters(NULL, Array)
#2 /home/testsystem/www/test887854.ch/cbctest/wp-includes/plugin.php(478): WP_Hook->do_action(Array)
#3 /home/testsystem/www/test887854.ch/cbctest/wp-content/plugins/woocommerce-subscriptions/includes/class-wc-subscriptions-checkout.php(103): do_action('woocommerce_che...', Object(WC_Subscription), Object(AutomatticWooCommerceAdminOverridesOrder), Object(WC_Cart))
已更新-变量$start_date
没有在你的代码中定义,还有其他错误。
尝试以下操作(未测试):
add_action( 'woocommerce_checkout_subscription_created', 'recalc_subscription_end_date' );
function recalc_subscription_end_date ($order, $subscription) {
if ( function_exists( 'wcs_order_contains_subscription' ) && wcs_order_contains_subscription( $order ) ) {
// The array of subscriptions dates
$date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end');
$dates = array(); // Initializing
foreach( $suscription_date_types as $date_type ) {
$dates[$date_type] = $subscription->get_date($date_type);
}
// Set subscription end date based on subscription variation
$dates['end'] = date( 'Y-m-d H:i:s',strtotime( "+12 months", strtotime( $dates['start'] ) ) );
$subscription->update_dates($dates);
$subscription->save();
}
}
代码放在活动子主题(或活动主题)的functions.php文件中。可以的。