У меня проблема с датой окончания подписок WooCommerce. Я нашел эту тему здесь Срок действия изменения подписки Woocommerce Однако наш случай здесь немного разные, но эта тема была полезной.
Мы используем настройку пропорциональной ставки (10-е число каждого месяца), чтобы создавать порядок продления (каждый месяц) в одно и то же время. Это нормально работает. Также мы используем членство в WooCommerce, чтобы клиент мог получить доступ к определенному членскому контенту. Подписка WooCommerce автоматически устанавливает дату окончания на основе даты последней оплаты. У нас есть вариант подписки на продукт с разной продолжительностью. (3, 6 и 12 месяцев)
С этим у нас возникает следующая проблема: когда клиент заказывает сегодня подписку 03.04.2021 (д / м / г), тогда система создаст подписку с первым платежом 10.03. / 2021. В этом случае дата окончания будет 10.06.2021. (03.10.2021 + 3 месяца) Но мы хотим, чтобы дата окончания была 06.04.2021 (начальная дата +3 месяца) вместо 06.10.2021.
Для этого мы пытаемся рассчитать дату окончания подписки на основе даты начала (даты заказа) и конкретного варианта подписки (3. 6 или 12 месяцев).
Пример:
- 04/03/2021 (Дата заказа и первоначальный родительский заказ создан)
- 03.10.2021 (Отгрузка 1)
- 04.10.2021 (Отгрузка 2)
- 05.10.2021 (Отгрузка 3)
= ›Дата окончания должна быть 04.06.2021, а не 10.06.2021.
Другой пример:
- 20.03.2021 (Дата заказа и Создан первоначальный родительский заказ)
- 04.10.2021 (Отгрузка 1)
- 05.10.2021 (Отгрузка 2)
- 06.10.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 месяцев жестко запрограммирован для каждого варианта. Как мне тогда получить доступ к массиву для всех трех вариантов?
Наши идентификаторы вариантов: 11903 на 3 месяца, 11904 на 6 месяцев, 11905 на 12 месяцев,
[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(Automattic\WooCommerce\Admin\Overrides\Order), Object(WC_Cart))
woocommerce_checkout_subscription_created
принимает три параметра, и первым из них является экземпляр WC_Subscription. Ваш берет всего один и, кажется, предполагает, что это был объект заказа? - person CBroe   schedule 04.03.2021