Как автоматически завершать заказы WooCommerce, когда они переходят в статус «Обработка»

Опубликовано: 2019-04-06

Каждый сайт электронной коммерции требует отслеживания и управления заказами, что может быть довольно сложной задачей для администратора, учитывая количество заказов, которые средний сайт электронной коммерции с высокой посещаемостью получает в день. Когда дело доходит до WooCommerce, заказ создается сразу после завершения процесса оформления заказа (ознакомьтесь с потоком статуса заказа WooCommerce ниже).

В зависимости от того, где находится заказ в цепочке «оплата-доставка», ему присваивается статус. Эти статусы устанавливаются и/или изменяются WooCommerce, платежным шлюзом и владельцем/администратором магазина в зависимости от того, где находится заказ.

Прежде чем мы рассмотрим поток заказов в WooCommerce, давайте определим статус заказа в Woocommerce для новичков.

Что такое статус заказа в WooCommerce?

Статус заказа — это представление текущего состояния, в котором находится заказ, сделанный покупателем . Статус заказа в Woocommerce меняется по мере того, как заказ обрабатывается до этапа доставки или возврата денег в случае возникновения проблемы с продуктом/услугами и когда владелец магазина согласился вернуть деньги покупателю. Например, когда клиент размещает заказ на определенный продукт, сразу же будет установлен следующий статус заказа в последовательности, то есть «Ожидание платежа». Отложенный платеж установлен по умолчанию в Woocommerce.

Теперь давайте посмотрим на блок-схему для лучшего понимания.

Блок-схема статуса заказа Woocommerce

Woocommerce Order Status Flow Chart
Источник: https://docs.woocommerce.com/document/managing-orders/

Как показано, после успешного завершения оплаты заказа его статус устанавливается на «В обработке» до тех пор, пока владелец магазина вручную не изменит его на «Выполнен». Это накладная задача для владельца магазина или администратора, особенно в случаях, когда объем продаж высок. Один из способов сделать этот процесс эффективным — автоматически выполнять заказы WooCommerce, когда они переходят в статус «Обработка». Давайте посмотрим, как мы можем это сделать, используя фрагмент кода.

Полный список статусов заказов в WooCommerce

  • Ожидание оплаты: это появляется по умолчанию, когда заказ был размещен, но оплата не была произведена.
  • Failed: это означает, что платеж не прошел и был отклонен.
  • Обработка: это означает, что платеж прошел и был получен владельцами магазина, и теперь его можно обработать для отправки и доставки.
  • Выполнено: это означает, что все прошло хорошо, и теперь заказ выполнен и завершен.
  • В ожидании : указывает на состояние, при котором заказ требует подтверждения от владельца магазина.
  • Отменен : Статус заказа «Отменен» не требует дальнейших действий. Отмена может быть либо от администратора, либо от клиента в какой-то момент.
  • Refunded: Заказ был возвращен, никаких дополнительных действий не требуется.

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

Автоматически устанавливать статус заказа WooCommerce как «Выполнен» в зависимости от способа оплаты.

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

 add_action('woocommerce_order_status_changed', 'ts_auto_complete_by_payment_method');

функция ts_auto_complete_by_payment_method($order_id)
{
  
  если ( ! $order_id ) {
        возвращаться;
  }

  глобальный $продукт;
  $order = wc_get_order($order_id);
  
  if ($order->data['status'] == 'в обработке') {
        $payment_method=$order->get_payment_method();
        если ($payment_method!="наложенный платеж")
        {
            $order->update_status('завершено');
        }
      
  }
  
}

Здесь вы будете использовать хук woocommerce_order_status_changed для вызова функции при изменении статуса заказа. После проверки наличия у заказа статуса «В обработке», только если способ оплаты не «Наложенный платеж», статус заказа изменится на « Выполнен ». WooCommerce имеет четыре способа оплаты по умолчанию, а именно. Прямой банковский перевод (бакс), чековые платежи (чек), наложенный платеж (наложенный платеж) и PayPal (paypal). В зависимости от того, для какого способа оплаты вы указываете условие, вам нужно будет использовать соответствующий идентификатор , например, «бакс», «чек», «треска», «paypal».

Автоматически устанавливать статус заказа WooCommerce как «Выполнен» для виртуальных продуктов.

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

automatically Complete WooCommerce orders when they go to the Processing status - Virtual Product Example - Store Membership
Пример виртуального продукта

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

 add_action('woocommerce_order_status_changed', 'ts_auto_complete_virtual');

функция ts_auto_complete_virtual($order_id)
{
  
  если ( ! $order_id ) {
        возвращаться;
  }
  
  глобальный $продукт;
  $order = wc_get_order($order_id);
  
  if ($order->data['status'] == 'в обработке') {
    
    $virtual_order = ноль;

    если (количество($order->get_items()) > 0) {

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

        если ( 'line_item' == $item['type'] ) {

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

          если ( ! $_product->is_virtual() ) {
            // как только мы найдем один не виртуальный продукт, выходим из цикла
            $virtual_order = ложь;
            ломать;
          } 
          еще {
            $virtual_order = истина;
          }
       }
     }
   }

    // если все виртуальные товары, пометить как завершенные
    если ($virtual_order) {
      $order->update_status('завершено');
    }
  }	
}

Здесь мы используем тот же хук для вызова нашей функции ts_auto_complete_virtual . После проверки того, находится ли заказ в статусе «Обработка», вам нужно просмотреть каждый элемент в заказе, чтобы увидеть, является ли он виртуальным продуктом.

Вывод

Типичный заказ Woocommerce имеет множество связанных с ним элементов, таких как продукты, доставка, сборы и т. д. Здесь line_item относится к продукту. Только продукты нужно извлекать один за другим, чтобы проверить, являются ли они виртуальными. Если хотя бы один товар не является виртуальным товаром, статус заказа не будет помечен как Выполненный.

Однако в зависимости от ваших требований и использования первого фрагмента кода в этом посте вы можете добавить дополнительные условия, чтобы отметить статус заказа как «Выполнен». Например, если вы хотите пометить Статус заказа как Завершенный даже для невиртуальных продуктов (если оплата за эти продукты произведена), вы можете сделать это, добавив проверку в методе оплаты после того, как он проверит, является ли он виртуальным. товар. Однако с помощью этого фрагмента кода статус заказа будет установлен как « Выполнен » только в том случае, если все продукты в заказе являются виртуальными продуктами.