Изменить дату окончания подписки WooCommerce

У меня проблема с датой окончания подписок 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))

person Nik7    schedule 04.03.2021    source источник
comment
Вы только что написали около двух экранных страниц текста, не сообщая нам, что на самом деле происходит с кодом, который вы пробовали.   -  person CBroe    schedule 04.03.2021
comment
Ой, извините .. Я забыл об этом! Виноват! Обновил вопрос. Спасибо за отзыв, дружище! :)   -  person Nik7    schedule 04.03.2021
comment
Согласно документации, функция обратного вызова для woocommerce_checkout_subscription_created принимает три параметра, и первым из них является экземпляр WC_Subscription. Ваш берет всего один и, кажется, предполагает, что это был объект заказа?   -  person CBroe    schedule 04.03.2021
comment
Кажется, я скучаю по этому поводу. Я обновил код и попробовал еще раз. Дата окончания не изменилась. Я впервые работаю с подпиской WooCommerce. Так что у меня нет опыта, как правильно получить доступ к дате.   -  person Nik7    schedule 04.03.2021


Ответы (1)


Обновлено - переменная $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 активной дочерней темы (или активной темы). Это могло сработать.

person LoicTheAztec    schedule 04.03.2021
comment
Спасибо. Но с этим кодом я не могу оформить заказ на подписку. Я получаю сообщение "замечено красным", в котором нет сообщения. И также нет сообщения об ошибке в режиме отладки. Когда я удалю код, я могу оформить заказ без проблем. - person Nik7; 04.03.2021
comment
да. Я только что обновил вопрос с ошибкой. - person Nik7; 04.03.2021
comment
@ Nik7 Я удалил can_date_be_updated() метод… и внес небольшие изменения. Но я не уверен, что это сработает. - person LoicTheAztec; 04.03.2021
comment
Спасибо. Но ошибка все еще существует. Тот же код ошибки, и проверка не работает. Даже при новой установке с добавленным только плагином подписки. Я не понимаю почему? Мы вызываем действие после создания подписки, почему невозможно оформить заказ? - person Nik7; 05.03.2021
comment
@ Nik7 Извините, я правда пока не знаю ... - person LoicTheAztec; 05.03.2021