Статус автозавершения для всех существующих заказов на обработку в WooCommerce

Я использую в WooCommerce этот небольшой кусочек кода из этого ответа для автозаполнения платных заказов на обработку:

/**
 * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );

  // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
  if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) {
    return;
    } 
  // "completed" updated status for paid Orders with all others payment methods
    else {
        $order->update_status( 'completed' );
    }
} 

Но проблема в том, что я использую специальный платежный шлюз по SMS, API которого соединяется с методом оплаты «cod», и заказы иногда остаются в состоянии ожидания на этом хуке «woocommerce_thankyou».

Поэтому мне нужно будет постоянно сканировать заказы на «обработку», чтобы передать их в полном статусе. Я пробовал разные вещи и хуки, но не могу заставить их работать должным образом.

Как я могу это сделать?

Спасибо


person Nacer Chikhi    schedule 08.12.2016    source источник


Ответы (2)


Чтобы это заработало, вам просто нужна небольшая функция, которая будет сканировать все заказы со статусом обработки на хуке 'init' и обновлять этот статус до завершенного.

Вот этот код:

function auto_update_orders_status_from_processing_to_completed(){
    // Get all current "processing" customer orders
    $processing_orders = wc_get_orders( $args = array(
        'numberposts' => -1,
        'post_status' => 'wc-processing',
    ) );
    if(!empty($processing_orders))
        foreach($processing_orders as $order)
            $order->update_status( 'completed' );
}
add_action( 'init', 'auto_update_orders_status_from_processing_to_completed' );

Этот код протестирован и работает.

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

СОВЕТЫ И ОБНОВЛЕНИЕ

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

person LoicTheAztec    schedule 08.12.2016
comment
Отлично, этот фрагмент кода делает именно то, что нужно для выполнения моих требований. Спасибо, Лоик, за помощь, ты спас мои выходные;) - person Nacer Chikhi; 08.12.2016

Виртуальные заказы WooCommerce могут быть автоматически помечены как «завершенные» после оплаты с помощью небольшого количества кода, добавленного в настраиваемый плагин или файл functions.php вашей темы. По умолчанию WooCommerce помечает загружаемые виртуальные заказы как завершенные после успешной оплаты, что имеет смысл, но некоторые владельцы магазинов захотят иметь возможность автоматически отмечать даже виртуальный заказ как завершенный после оплаты, например, в случае сайта. который принимает пожертвования там, где не требуется никаких дальнейших действий. Для этого используйте следующий код, основанный на основном статусе выполненного виртуально загружаемого заказа:

add_filter( 'woocommerce_payment_complete_order_status', 'virtual_order_payment_complete_order_status', 10, 2 );

function virtual_order_payment_complete_order_status( $order_status, $order_id ) {
  $order = new WC_Order( $order_id );

  if ( 'processing' == $order_status &&
       ( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) {

    $virtual_order = null;

    if ( count( $order->get_items() ) > 0 ) {

      foreach( $order->get_items() as $item ) {

        if ( 'line_item' == $item['type'] ) {

          $_product = $order->get_product_from_item( $item );

          if ( ! $_product->is_virtual() ) {
            // once we've found one non-virtual product we know we're done, break out of the loop
            $virtual_order = false;
            break;
          } else {
            $virtual_order = true;
          }
        }
      }
    }

    // virtual order, mark as completed
    if ( $virtual_order ) {
      return 'completed';
    }
  }

  // non-virtual order, return original status
  return $order_status;
}

ИЛИ

Вы также можете использовать плагин для автозаполнения заказа

Вот URL-адрес плагина: https://wordpress.org/plugins/woocommerce-autocomplete-order/screenshots/

Пожалуйста, дайте мне знать, какой из них вам полезен.

Thnaks.

person Mr. HK    schedule 08.12.2016
comment
Извините, HK, но у меня это не сработало, но предыдущий ответ от Loïc делает именно то, что я ищу. Спасибо, в любом случае :) - person Nacer Chikhi; 08.12.2016
comment
В любое время @NacerChikhi - person Mr. HK; 08.12.2016