Мне нужно отменить отложенные ордера в определенном сценарии через 4 часа после создания ордера.
Пример: 2 клиента
1-ый клиент делает заказ в 17:00, поэтому его статус приостановлен (я хочу, чтобы он был отменен через 4 часа с даты создания заказа, если он не оплатил, поэтому он должен быть отменен 9: 00:00)
2-ой заказчик делает заказ в 5:37, поэтому он находится в режиме ожидания (я хочу, чтобы он был отменен через 4 часа после даты создания заказа, если он не оплатил, поэтому он должен быть отменен 9: 37)
Я хочу, чтобы он отменял заказы сразу после истечения каждого заказа по истечении 4 часов с даты создания заказа отдельно, а не как задание cron, чтобы работать каждые 4 часа, как в предыдущем примере, если событие cron начинается в 6: 00:00 и будет выполняться каждые 4 часа, поэтому первый заказ клиента истекает в 22:00, а второй - также в 22:00.
Я попробовал решение здесь Автоматически отменять заказ через X дней, если в WooCommerce нет платежей
, но он не смог истечь через 4 часа, как это определено только в днях, также не знал, какой из них ответ является лучшим для меня сценарием для каждого ордера, который будет отменен отдельно через 4 часа после создания дата не как событие cron,
Я использовал многие из решений, упомянутых в соответствующем вопросе выше, но только тот, который запоминает первый ответ, когда я помню, когда администратор / менеджер магазина посещает страницу заказов. Мне нужно, чтобы это делалось автоматически, без каких-либо действий со стороны людей. .
Вот мой код в плагине для отмены заказов
<?php
function ash2osh_faw_get_unpaid_submitted() {
global $wpdb;
$options = get_option('woocommerce_' . ASH2OSH_FAW_PAYMENT_METHOD . '_settings');
$expire_hours = $options['unpaid_expire'];
if(!trim($expire_hours)){
$expire_hours='48';
}
$unpaid_submitted = $wpdb->get_col( $wpdb->prepare( "
SELECT posts.ID
FROM {$wpdb->posts} AS posts
WHERE posts.post_status = 'wc-on-hold'
AND posts.post_date < %s
", date( 'Y-m-d H:i:s', strtotime('-'.$expire_hours.' hours') ) ) );
return $unpaid_submitted;
}
function ash2osh_faw_wc_cancel_unpaid_submitted() {
$unpaid_submit = ash2osh_faw_get_unpaid_submitted();
if ( $unpaid_submit ) {
foreach ( $unpaid_submit as $unpaid_order ) {
$order = wc_get_order( $unpaid_order );
$cancel_order = True;
foreach ( $order->get_items() as $item_key => $item_values) {
$manage_stock = get_post_meta( $item_values['variation_id'], '_manage_stock', true );
if ( $manage_stock == "no" ) {
$payment_method = $order->get_payment_method();
if ( $payment_method == "cheque" ) {
$cancel_order = False;
}
}
}
if ( $cancel_order == True ) {
$order -> update_status( 'cancelled', __( 'Unpaid submission expired after hours set in payment plugin options.', 'woocommerce') );
}
}
}
}
add_action( 'woocommerce_cancel_unpaid_submitted', 'ash2osh_faw_wc_cancel_unpaid_submitted' );//for customization purposes
Это третье решение здесь: Автоматически отменять заказ через X дней, если платеж в WooCommerce не проверяется и работает нормально: НО я хочу, чтобы он был отменен, когда заказ находится в состоянии удержания, а не завершено / обрабатывается и подлежит отмене, если прошло 4 часа после даты создания заказа, и это должно быть запланировано и выполняться каждые 30 минут, а не ежедневно