Я использую 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' );
}
}
}
}
Этот код может работать, если кто-нибудь сможет его проверить, пожалуйста.






Обновлено
Лучше получить все обрабатываемые заказы и проверить наличие бронирований, дата начала которых уже прошла.
Вместо этого попробуйте следующее: это должно автоматически завершать обработку заказов с бронированиями, дата начала которых уже пройдена (с использованием почасовой запланированной задачи):
// 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() ) {