Автоматическое завершение обработки заказов WooCommerce с бронированиями, дата начала которых уже прошла

Я использую WooCommerce Bookings для продажи билетов на свою ферму/контактный зоопарк. Клиенты могут купить билеты на определенные дни и время. Я проверяю их через приложение WooCommerce, сканируя их заказ и завершая его. Мне нужен способ автоматически обновлять заказы, которые так и не появились и срок их действия истек, чтобы они не могли появиться и использовать свой билет в любой день.

Я нашел WooCommerce Bookings — изменение статуса заказа с «Ожидание платежа» на «Отменен» через 24 часа код ответа, что-то вроде того, что я ищу. Однако я хочу, чтобы только заказы, дата которых истекла и еще не завершена, менялись с «обработки» на «завершено».


Обновлено:

Это моя попытка кода:

function update_booking_status_to_completed() {
    // Get all bookings
    $args = array(
        'post_type' => 'wc_booking',
        'post_status' => 'any',
        'posts_per_page' => -1,
    );
    $bookings = get_posts( $args );

    foreach ( $bookings as $booking_post ) {
        $booking = new WC_Booking( $booking_post->ID );

        // Get booking start date
        $start_date = $booking->get_start_date();

        // Check if start date has passed
        if ( strtotime( $start_date ) < current_time( 'timestamp' ) ) {
            $order = wc_get_order( $booking->get_order_id() );

            // Check if order status is processing
            if ( $order->get_status() == 'processing' ) {
                // Update order status to completed
                $order->update_status( 'completed' );
            }
        }
    }
}

Этот код может работать, если кто-нибудь сможет его проверить, пожалуйста.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
1
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено

Лучше получить все обрабатываемые заказы и проверить наличие бронирований, дата начала которых уже прошла.

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

// Define a custom schedule time for Cron schedules tasks
add_filter( 'cron_schedules','hourly_cron_schedule' );
function hourly_cron_schedule( $schedules ) {
    if ( ! isset( $schedules["hourly"] ) ) {
        $schedules["hourly"] = array(
            'interval' => HOUR_IN_SECONDS,
            'display' => __( 'Hourly' )
        );
    }
    return $schedules;
}

// Define the scheduled task
add_action('init', 'my_custom_schedule_task');
function my_custom_schedule_task() {
    // Schedule an action (if it's not already scheduled)
    if ( ! wp_next_scheduled( 'scheduled_complete_processing_orders' ) ) {
        wp_schedule_event( time(), 'hourly', 'scheduled_complete_processing_orders' );
    }
}


// Function to run on the scheduled event
add_action( 'scheduled_complete_processing_orders', 'complete_processing_orders_with_bookings' );
function complete_processing_orders_with_bookings() {
    // Get all processing orders
    $orders = wc_get_orders( array(
        'type'        => 'shop_order',
        'limit'       => -1,
        'status'      => 'processing', 
    ) );

    // Lopp through processing orders
    foreach ( $orders as $order ) {
        // Get Bookings (IDs) from the order
        $booking_ids = WC_Booking_Data_Store::get_booking_ids_from_order_id( $order->get_id() );

        // Only orders with bookings
        if ( $booking_ids ) {
            // Loop through bookings within the order
            foreach ( $booking_ids as $booking_id ) {
                $booking = new WC_Booking( $booking_id ); // Get the WC_Booking object

                // If start date has passed 
                if ( strtotime( $booking->get_start_date() ) < time() ) {
                    $order->update_status( 'completed' );
                }
            }
        }
    }
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Это может сработать.


Дополнение по вашему комментарию:

Чтобы заставить его работать на следующий день, это очень просто, просто замените эту строку кода:

if ( strtotime( $booking->get_start_date() ) < time() ) {

с:

if ( ( strtotime( $booking->get_start_date() ) + DAY_IN_SECONDS ) < time() ) {

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

Отображение определенного атрибута продукта с помощью короткого кода в продукте WooCommerce
Непоследовательное поведение CSS для пользовательской подсказки JavaScript
Добавьте собственную схему структурированных данных на страницы архива WooCommerce
Изменить CSS только для уведомления о новом заказе WooCommerce, отправленного администраторам
Добавляйте буферный период к продуктам WooCommerce, доступным для бронирования, только при наличии существующих заказов
Добавьте виджет в WooCommerce Checkout Order Review перед кнопкой отправки
Добавьте цену товара за килограмм в уведомление о новом заказе WooCommerce
Данные пользовательского элемента корзины WooCommerce отображаются дважды в блоках корзины и оформления заказа
Отображение оставшегося количества на складе для каждой позиции заказа только в уведомлении по электронной почте о новом заказе WooCommerce
Используйте значения полей продукта WC Kalkulator для обновления свойств продукта в корзине WooCommerce