Статус автоматического завершения для всех существующих заказов на обработку в 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".



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

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



Спасибо

901   2  

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' );

Этот код тестируется и работает.

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

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

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

Виртуальные заказы WooCommerce могут быть автоматически помечены как "завершенные" после оплаты с небольшим количеством кода, добавленного в пользовательский плагин или ваши функции тем.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/

Пожалуйста, дайте мне знать, что является пользой для вас.

Благодарим.

Comments

    Ничего не найдено.