it-swarm.com.ru

Автоматически удалять отмененный заказ в Woocommerce

Оглядываясь на этом сайте и в Интернете, но не могу найти решение. Мой клиент хочет, чтобы каждый заказ, статус которого был отменен, был полностью удален из WooCommerce через некоторое время.

<?php
function update_order_status( $order_id ) {
$order = new WC_Order( $order_id );
$order_status = $order->get_status();

if ('cancelled' == $order_status || 'failed' == $order_status ||   'pending' == $order_status ) {    
        wp_delete_post($order_id,true);    
   }    


}

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

Таким образом, TL; DR Заказы со статусом "отменено", "не выполнено" и "в ожидании" должны быть полностью удалены через 5 минут.

Кто-нибудь, кто мог бы помочь мне в этом?

С наилучшими пожеланиями, Дилан

1
Dylan Smit

выполните следующий код в файле function.php вашей дочерней темы, как указано ниже.

function wc_remove_cancelled_status( $statuses ){
  if( isset( $statuses['wc-cancelled'] ) ){
      unset( $statuses['wc-cancelled'] );
  }
  return $statuses;
} 
add_filter( 'wc_order_statuses', 'wc_remove_cancelled_status' );
1
Niket Joshi

Я думаю, что пользователь может изменить статус заказа в течение пяти минут. Поэтому я написал следующий код с

add_action( 'woocommerce_order_status_failed', 'the_dramatist_woocommerce_auto_delete_order' );
add_action( 'woocommerce_order_status_pending', 'the_dramatist_woocommerce_auto_delete_order' );
add_action( 'woocommerce_order_status_cancelled', 'the_dramatist_woocommerce_auto_delete_order' );

function the_dramatist_woocommerce_auto_delete_order( $order_id ) {
    // 5*60 = 300 seconds. Here 1minute = 60 seconds.
    wp_schedule_single_event(tim() + 300, 'the_dramatist_main_delete_event', $order_id);
}

function the_dramatist_main_delete_event( $order_id ) {
    global $woocommerce;
    $order = new WC_Order( $order_id );
    $order_status = $order->get_status();
    if ( !$order_id )
        return false;
    if ('cancelled' == $order_status || 'failed' == $order_status ||   'pending' == $order_status ) {
        wp_delete_post($order_id,true);
        return true;
    }
    return false;
}

Здесь мы обнаруживаем изменение статуса заказа, и снова проверяем статус заказа после пробуждения из спящего режима. Таким образом, если пользователь изменит статус заказа через пять минут, то удаление не произойдет. Пожалуйста, проверьте это. Я не проверял это. Надеюсь, что это поможет вам.

Постскриптум Я думаю, что функция sleep() вызовет некоторую задержку в жизненном цикле WordPress. Так что лучше мы используем функцию wp_schedule_single_event. Поэтому я обновил свой код.

1
CodeMascot

Хм ... Если мы используем ваш сценарий, я думаю, если вы сэкономите время, как:

<?php
function update_order_status( $order_id ) {
$order = new WC_Order( $order_id );
$order_status = $order->get_status();

if ('cancelled' == $order_status || 'failed' == $order_status ||   'pending' == $order_status ) { 
        $current_time = date('h:i:s');    /* this is not necessary - not being used. */

        sleep(300);       // 300 seconds in 5 minutes

        wp_delete_post($order_id,true);    
   }    


}

Слушай, я не знаю, сработает ли это, но стоит попробовать.

0
user23355