Подписки WooCommerce: измените даты продления после оформления заказа - PullRequest
0 голосов
/ 03 августа 2020

У меня 1 подписка с 3 вариантами. Я пытаюсь установить дату первого продления в зависимости от приобретенного идентификатора варианта.

Вариант 1 (876) настроен на ежедневное продление - я хочу, чтобы дата первого повторного счета была 15 ноября 2020 г. 12:00 AM Вариант 2 (877) настроен на продление каждые 2 дня - я хочу, чтобы первая дата повторного счета была 2/15/2021 12:00 AM Вариант 3 (878) настроена на продление каждые 3 дня - Я хочу первый повторный счет дата должна быть 15.08.2021 12:00 AM

Я думал, что приведенный ниже код сработал. После создания заказа следующая дата выставления счета ДЕЙСТВИТЕЛЬНО показывает одну из указанных выше дат, но она не должна регистрироваться в WooCommerce или чем-то еще, потому что обновления запускаются независимо от вышеуказанных дат.

Для моего теста я создайте заказ для Варианта 1, следующая дата платежа - 15.11.2020, но на следующий день он будет обновлен.

Надеюсь получить некоторое представление от кого-то более умного, чем я. Опять же, дата следующего выставления счета сабвуфера показывает указанные выше даты, но продление все еще происходит раньше / раньше указанных дат.


function nextpaymentdatechange( $order_id ){
    $order = wc_get_order( $order_id );
$items = $order->get_items(); 
foreach ( $items as $item_id => $item ) {
   $product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
   if ( $product_id === 876 ) {
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $new_date = date( 'Y-m-d H:i:s', strtotime( '2020-11-15 07:00:00', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $new_date);
   }
    else{ if ( $product_id === 877 ) {
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $new_date = date( 'Y-m-d H:i:s', strtotime( '2021-02-15 07:00:00', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $new_date);
    }
         else{
              if ( $product_id === 878 ) {
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $new_date = date( 'Y-m-d H:i:s', strtotime( '2021-08-03 07:00:00', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $new_date);
    }
         }
        
    }
   }
} ```

Ответы [ 2 ]

0 голосов
/ 03 сентября 2020

если я понимаю, это:

function nextpaymentdatechange( $order_id ){
// YOUR SETTINGS: Set in this array your desired dates (value(s)) by product Id (key)
$dates_for_product = array(
    588 => array(
        'end' => '2020-12-05 07:00:00',
    ),
);

// The date types for subscriptions
$suscription_date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end');

Автоматически установить дату окончания 5 декабря для моего продукта 588 (это простая подписка)?

0 голосов
/ 03 августа 2020

Чтобы это работало, вам нужно сначала получить WC_Subscription Объекты из заказа, используя:

$subscriptions = wcs_get_subscriptions_for_order( $order_id );

, который дает массив объектов WC_Subscription для Заказа, из идентификатора заказа.

Теперь вы можете использовать метод WC_Subscription update_dates($dates), который требует установки массива всех типов дат из подписки: 'start', 'trial_end', 'next_payment', 'last_payment' и 'end'.

Чтобы получить конкретную c дату из подписки, мы используем WC_Subscription метод get_date($date_type).

Кроме того, я использую WC_Subscription метод can_date_be_updated($date_type), чтобы проверить, можно ли обновить тип даты.

Я не уверен, какие даты требуют обновления, поскольку они, вероятно, связаны .

Вы можете попробовать следующее, чтобы обновить даты связанных подписок из заказа на основе вашего кода (код не вызывает ошибок) .

Я думаю, вам нужно изменить даты 'next_payment', 'last_payment' и 'end'.

Используя методы update_dates () и save () в конец кода, позволяет изменять даты, сохранять все необходимые данные в базу данных обновлять кэшированные данные.

Код функции:

function nextpaymentdatechange( $order_id ){
    // YOUR SETTINGS: Set in this array your desired dates (value(s)) by product Id (key)
    $dates_for_product = array(
        876 => array(
            'next_payment' => '2020-11-15 07:00:00',
            'last_payment' => '2020-11-16 07:00:00',
        ),
        877 => array(
            'next_payment' => '2021-02-15 07:00:00',
            'last_payment' => '2021-02-16 07:00:00',
        ),
        878 => array(
            'next_payment' => '2021-08-03 07:00:00',
            'last_payment' => '2021-08-04 07:00:00',
        ),
    );

    // The date types for subscriptions
    $suscription_date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end');

    // Get the subscriptions from the current order Id
    $subscriptions = wcs_get_subscriptions_for_order( $order_id );

    // Loop through subscriptions
    foreach ( $subscriptions as $subscription_id => $subscription ) {
        // Loop through items in this subscription
        foreach ( $subscription->get_items() as $item_id => $item ) {
            $product = $item->get_product();

            // Loop through defined products dates
            foreach( $dates_for_product as $product_id => $new_dates ) {
                // If current subscription product id matches
                if ( $product->get_id() == $product_id ) {
                    $current_product_id = $product_id; // Set current product id
                    break; // Stop the current loop
                }
            }
            if ( isset($current_product_id) ) {
                break; // Stop the current loop
            }
        }

        // Updating subscription dates
        if ( isset($current_product_id) ) {
            $updated_dates = array(); // Initializing

            // Loop through subscription date types
            foreach( $suscription_date_types as $date_type ) {
                $date           = $subscription->get_date($date_type);

                // For 'next_payment' and 'last_payment' dates
                if( isset($new_dates[$date_type]) && $subscription->can_date_be_updated($date_type) ) {
                    $updated_dates[$date_type] = $new_dates[$date_type];
                }
                // For 'end' date
                elseif ( $date_type === 'end' && $subscription->can_date_be_updated($date_type) ) {
                    $updated_dates[$date_type] = $new_dates['last_payment']; // ??? Or may be instead: $date;  … (or simply: 0;)
                }
                // Other dates
                else {
                    $updated_dates[$date_type] = $date;
                }
            }

            // Update subscription date, save to database and refresh cached data
            $subscription->update_dates($updated_dates);
            $subscription->save();
        }
    }
}

Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Должно работать.

...