Ограничить клиентам возможность покупать один раз в год в WooCommerce

Я использую это кодирование, чтобы запретить пользователям создавать заказы в год, и оно работает хорошо. Но я заметил, что если дата создания последнего заказа превышает 365 дней, кодирование принимает ее такой же, как и в этом году, поэтому пользователи, совершившие покупку более чем на 365 дней, не могут покупать снова. Может ли кто-нибудь просмотреть кодировку и внести необходимые изменения? Заранее спасибо!

function new_order_allowed() {
    if ( ! ( is_cart() || is_checkout() ) ) return;

    if ( is_user_logged_in() ) {
        $user_id = get_current_user_id();

        $last_order = wc_get_customer_last_order( $user_id );

        if ( $last_order ) {
            $date_created = $last_order->get_date_created()->format( 'z' ) + 1;
            $current_time = current_time( 'z', true ) + 1;
            $year_in_day = 365;
            $days_passed = $current_time - $date_created;

            if ( $days_passed < $year_in_day ) {
               wc_add_notice( sprintf( '<b>ONLY ONE PURCHASE IS ALLOWED WITHIN 365 DAYS. </b><br>Your last order was %1$s days ago. Please try again when the 365 day period has been reached. ',  $days_passed ), 'error' );

                remove_action( 'woocommerce_proceed_to_checkout','woocommerce_button_proceed_to_checkout', 20);
            }
        }
    }
}
add_action( 'woocommerce_check_cart_items', 'new_order_allowed' );

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему бы вам не сделать это простым способом?

$dateFrom = new DateTime($last_order->get_date_created()->getTimestamp());
$dateTo = new DateTime();
$dateTo->modify('-1 year');
echo $dateFrom->diff($dateTo)->days;

Таким образом $dateFrom->diff($dateTo)->days; вернет вам количество дней между обеими датами.

если я добавлю дату, как вы предлагаете, мне придется обновить ее вручную в будущем

Nat 11.07.2024 15:08

Вам не нужно указывать дату вручную: я корректирую ответ без даты вручную.

Paulo Teixeira 11.07.2024 20:23

выдает критическое сообщение об ошибке

Nat 12.07.2024 14:54
Ответ принят как подходящий

Я исправил ошибку и теперь всё работает, вот окончательный код на случай, если кому-то понадобится:

function new_order_allowed() {
    if ( ! ( is_cart() || is_checkout() ) ) return;

    if ( is_user_logged_in() ) {
        $user_id = get_current_user_id();

        $last_order = wc_get_customer_last_order( $user_id );

        if ( $last_order ) {
            $date_created = $last_order->get_date_created()->format( 'U' );
            $current_time = current_time( 'U', true );
            $year_in_sec = 60 * 60 * 24 * 365;
            $seconds_passed = $current_time - $date_created;
            $last_order_created = $last_order->get_date_created()->format( 'M d, Y' );  

            if ( $seconds_passed < $year_in_sec ) {
                wc_add_notice( sprintf( '<b>ONLY ONE PURCHASE IS ALLOWED WITHIN 365 DAYS. </b><br>Your last order was on %1$s. Please try again when the 365 day period has been reached. ', $last_order_created, $day_in_sec, $seconds_passed ), 'error' );
             remove_action( 'woocommerce_proceed_to_checkout','woocommerce_button_proceed_to_checkout', 20);
            }
        }
    }
}
add_action( 'woocommerce_check_cart_items', 'new_order_allowed' );

Другие вопросы по теме