Возможно, вы задаетесь вопросом: «Но я уже могу сделать это из настроек WooCommerce!«. Да, это верно. Перейдите в WooCommerce Settings > Products > Inventory и установите значение «Hold Stock Minutes» (Время блокировки запасов). После указанного периода неоплаченные заказы будут отмечены как отмененные, чтобы товар вернулся в исходное состояние. Зачем нужна «Автоматическая отмена заказов»?
Проблема заключается в следующем: а что, если вы не хотите использовать функцию «Hold Stock Minutes» вообще, а, что еще лучше, если вы не используете управление запасами? В таком случае заказы не будут автоматически отменяться.
Кроме того, что, если вам нужно выполнить условную работу, например, вы хотите отменить только «неудачные» заказы, оставив «в ожидании» без изменений? Даже в этом случае опция «блокировки запасов» не будет работать, так как вам нужно указать, какой статус заказа вы хотите отслеживать, а затем запустить функцию отмены.
add_action( 'woocommerce_order_status_pending', 'genius_cancel_failed_pending_order_event' );
function genius_cancel_failed_pending_order_event( $order_id ) {
if ( ! wp_next_scheduled( 'genius_cancel_failed_pending_order_after_one_hour', array( $order_id ) ) ) {
wp_schedule_single_event( time() + 3600, 'genius_cancel_failed_pending_order_after_one_hour', array( $order_id ) );
}
}
add_action( 'genius_cancel_failed_pending_order_after_one_hour', 'genius_cancel_order' );
function genius_cancel_order( $order_id ) {
$order = wc_get_order( $order_id );
wp_clear_scheduled_hook( 'genius_cancel_failed_pending_order_after_one_hour', array( $order_id ) );
if ( $order->has_status( array( 'pending' ) ) ) {
$order->update_status( 'cancelled', 'Заказ отменен после 1 часа ожидания' );
}
}
Выше представлен код, который позволяет автоматически отменять заказы в WooCommerce. Данный код выполняет следующие действия:
- При событии
woocommerce_order_status_pending
(заказ в ожидании) вызывается функцияgenius_cancel_failed_pending_order_event
, которая создает отложенное событие для отмены заказа через один час. - Функция
genius_cancel_failed_pending_order_event
проверяет, не запланировано ли уже отменное событие для указанного заказа, и если нет, то создает его с отсрочкой в один час. - По истечении указанного времени, вызывается функция
genius_cancel_order
, которая отменяет заказ, если его статус все еще «в ожидании» (pending). - Функция
genius_cancel_order
получает объект заказа по его идентификатору, очищает отложенное событие отмены для данного заказа и, если статус заказа все еще «в ожидании» (pending), обновляет его статус на «отменен» (cancelled) с указанием причины.
Вы можете использовать этот код в своем блоге для автоматической отмены заказов в WooCommerce, даже если вы не используете управление запасами или хотите отменить только определенные статусы заказов.