Диагностика проблемы: зачем отключать отгрузку после оплаты в WooCommerce
В WooCommerce заказ после оплаты автоматически переводится в статус, при котором магазин ожидает отгрузку товара. В некоторых бизнес-сценариях необходимо, чтобы после оплаты заказ не попадал в очередь на отгрузку — например, если товар поставляется в электронном виде, или отгрузка выполняется вручную и требует дополнительной проверки.
Типичная ситуация — заказ переходит в статус processing (в обработке), что подразумевает необходимость отгрузки, а мы хотим, чтобы после оплаты он переводился сразу в completed или другой статус, не вызывающий уведомления для службы доставки.
Пошаговое решение: автоматическое изменение статуса заказа после оплаты
1. Подключение к хуку изменения статуса заказа
Для изменения статуса заказа сразу после успешной оплаты используем хук woocommerce_payment_complete. Он срабатывает в момент успешного завершения платежа.
2. Пример кода для автоматического перевода заказа в статус "завершён"
add_action('woocommerce_payment_complete', 'auto_complete_order_after_payment');
function auto_complete_order_after_payment($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
// Проверяем, что заказ ещё не завершён
if ($order->get_status() !== 'completed') {
$order->update_status('completed', 'Автоматическое завершение заказа после оплаты.');
}
}
3. Уточнение условий для разных типов товаров
Если в магазине есть разные категории товаров, и автоматическое завершение нужно только для определённых из них (например, цифровые курсы), следует добавить проверку содержимого заказа:
add_action('woocommerce_payment_complete', 'auto_complete_order_for_digital_products');
function auto_complete_order_for_digital_products($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
$digital_only = true;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && !$product->is_virtual()) {
$digital_only = false;
break;
}
}
if ($digital_only && $order->get_status() !== 'completed') {
$order->update_status('completed', 'Автоматическое завершение заказа с цифровыми товарами.');
}
}
Проверка результата после внедрения кода
- Создайте тестовый заказ с товаром, соответствующим условию (виртуальный/цифровой или любой).
- Оплатите заказ через тестовый платежный шлюз.
- Перейдите в админку WooCommerce → Заказы и убедитесь, что статус заказа изменился на
completedсразу после оплаты. - Если условие с цифровыми товарами, проверьте заказ с физическими товарами — статус должен остаться обычным (например,
processing).
Частые ошибки и способы их устранения
- Код не срабатывает: проверьте, что код добавлен в файл
functions.phpактивной темы или в специально созданный плагин, и что нет синтаксических ошибок. - Статус не меняется для всех заказов: возможно, в магазине настроены дополнительные плагины, которые переопределяют логику обработки статусов — временно отключите их для теста.
- Заказы с физическими товарами тоже завершаются автоматически: проверьте логику проверки виртуальности товара, возможно, у некоторых физических товаров стоит флажок "виртуальный".
- Уведомления о заказе не приходят: изменение статуса напрямую влияет на уведомления — при необходимости настройте уведомления в WooCommerce или используйте плагин Clearfy Pro для управления ими.
Практические советы по безопасности и производительности
- Добавляйте код только в дочернюю тему или собственный плагин, чтобы избежать потери при обновлении.
- Используйте проверку
$orderи$order_idдля предотвращения ошибок PHP. - Минимизируйте нагрузку, избегая повторных вызовов
update_statusпри уже нужном статусе. - Для массовых заказов используйте WP-CLI для проверки и коррекции статусов, чтобы не нагружать сайт при высокой нагрузке.
Сравнение способов автоматического завершения заказа в WooCommerce
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Хук woocommerce_payment_complete с кодом |
Гибкость, контроль по типу товара, лёгкость настройки | Требует базовых знаний PHP, может конфликтовать с другими плагинами | Код из статьи, проверка виртуальности товаров |
| Плагины автоматизации статусов (например, WooCommerce Order Status Manager) | Удобный интерфейс, расширенные возможности автоматизации | Дополнительная нагрузка, лицензия, ограничения бесплатных версий | Настройка через админку плагина, без кода |
| Ручное изменение статусов после оплаты | Простота, нет риска ошибок в коде | Трудозатратно, неэффективно при большом количестве заказов | Открытие каждого заказа и смена статуса вручную |