Подписки WooCommerce: вычтите 1 день из $ end_date, когда статус изменится на pending_cancel

Я использую подписки WooCommerce с небольшим сервисом платежного шлюза, и они различаются по способу подсчета интервала подписки. WooCommerce считает месячный цикл с 15 апреля по 15 мая, а платежный шлюз - с 15 апреля по 14 мая. Это нормально, кроме случаев, когда пользователь пытается отменить подписку, например, 10 апреля. В этот день статус подписки изменится с «активна» на «ожидает отмены». Проблема в том, что мой платежный шлюз не распознает «ожидающую отмену». Он читает только «активен» или «отменен», поэтому 14 мая платежный шлюз снова взимает плату с пользователя.

Я хотел бы добавить действие, чтобы Woocommerce вычитала 1 или 2 дня из $ end_date подписки только тогда, когда пользователь меняет свою подписку с «активной» на «ожидающую отмену». Таким образом, когда это будет 14 мая, статус будет изменен с «ожидает отмены» на «отменен», и тогда платеж через межсетевой интерфейс не будет взиматься с пользователя. Я считаю, что действие должно выглядеть примерно так:

    add_action( 'woocommerce_subscription_status_pending-cancel', 'subtract_day_from_end_date', 10, 1 );

function subtract_day_from_end_date( $subscription, $end_date ) {
    // some code here
}

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: после помощи @mujuonly, которая, к сожалению, не сработала, я попробовал приведенный ниже код, снова безуспешно:

add_filter( 'woocommerce_subscription_calculated_end_date', 'subtrai_dias_end_date' );
function subtrai_dias_end_date( $end_date, $subscription ) {
    if ($end_date != 0) {
        $end_date = date( 'Y-m-d H:i:s', strtotime( "-2 days", strtotime( $end_date ) ) );

    } else {
        $end_date = $subscription->calculate_date( 'end_of_prepaid_term' );
        $end_date = date( 'Y-m-d H:i:s', strtotime( "-2 days", strtotime( $end_date ) ) ); 
    }

    $dates_to_update = array();
    $dates_to_update['end'] = $end_date;
    $subscription->update_dates($dates_to_update);
}

Я подумал, что, возможно, $ end_date может быть пустым, поэтому добавил чек. Кроме того, просматривая документацию, я обнаружил функцию update_dates, для которой требуется массив, поэтому я добавил ее. Тоже не сработало.

Любая помощь будет принята с благодарностью.


person Erick Paulino    schedule 14.05.2020    source источник


Ответы (1)


add_filter( 'woocommerce_subscription_calculated_end_date', 'woocommerce_subscription_calculated_end_date' );

function woocommerce_subscription_calculated_end_date( $end_date, $subscription ) {

    $end_date = date( 'Y-m-d H:i:s', strtotime( "-2 days", strtotime( $end_date ) ) );
    return $end_date;
}

введите здесь описание изображения

Попробуйте это

person mujuonly    schedule 14.05.2020
comment
Спасибо, @mujuonly. Боюсь, этот код будет срабатывать при каждой новой подписке, верно? Я хочу, чтобы он запускался только тогда, когда пользователь переходит на страницу администратора своих подписок и нажимает отменить подписку. Дата окончания должна быть изменена только в том случае, если для статуса подписки установлено значение Ожидает отмены. В противном случае подписка будет отменена, даже если пользователь не попросит об этом, потому что интервал подписки закончится за день до того, как платежный шлюз взимает плату с пользователя. - person Erick Paulino; 14.05.2020
comment
Я отредактировал вопрос, чтобы уточнить, что дни должны вычитаться только тогда, когда пользователь отменяет свою подписку, то есть только когда подписка изменяется с активной на ожидающую отмену. - person Erick Paulino; 14.05.2020
comment
@ErickPaulino AFAI этот хук сработает только при изменении статуса с активного на ожидающий отмены - person mujuonly; 15.05.2020
comment
Хорошо, я только что протестировал код, но, к сожалению, он не сработал. Никаких сообщений об ошибках, ничего странного, просто интервал остался прежним. Я даже пробовал другой подход, используя функцию update_dates, для которой требуется массив, но это тоже не сработало. Если у вас есть время, я буду очень признателен за дополнительную помощь. Спасибо! - person Erick Paulino; 15.05.2020