WooCommerce: автоматическое отключение отгрузки товара при оплате

В чем суть задачи: зачем отключать отгрузку после оплаты

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

Диагностика проблемы: как понять, что отгрузка не отключается

Основные признаки проблемы:

  • Статус заказа меняется на "оплачен", но в админке отображается необходимость доставки;
  • Клиенты получают уведомления о доставке, хотя товар цифровой;
  • В отчетах по заказам и по складу показывается неверная информация о доставке.

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

  • Открыть заказ в админке и посмотреть вкладку "Доставка" или "Shipping";
  • Посмотреть метаданные заказа через базу данных или плагин "WP Crontrol";
  • Проверить логи WooCommerce и ошибок сервера.

Пошаговое решение: как отключить отгрузку автоматически после оплаты

1. Используем хук woocommerce_order_status_completed для отработки успешной оплаты

Этот хук срабатывает, когда заказ переходит в статус "завершен" — что обычно означает, что оплата прошла и товар отгружен. Чтобы сразу отключить отгрузку, можно также использовать woocommerce_order_status_processing, если оплата подтверждается на этом этапе.

2. Очищаем данные доставки из заказа

Ниже пример кода, который удаляет все данные о доставке из заказа при смене статуса на processing или completed. Код добавляем в functions.php вашей темы или в отдельный плагин:

add_action('woocommerce_order_status_processing', 'disable_shipping_after_payment', 10, 1);
add_action('woocommerce_order_status_completed', 'disable_shipping_after_payment', 10, 1);

function disable_shipping_after_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Очищаем адрес доставки
    $order->set_shipping_address_1('');
    $order->set_shipping_address_2('');
    $order->set_shipping_city('');
    $order->set_shipping_postcode('');
    $order->set_shipping_country('');
    $order->set_shipping_state('');

    // Сбрасываем выбранный метод доставки
    $order->set_shipping_total(0);
    $order->set_shipping_tax(0);

    // Удаляем данные о доставке из метаданных
    $order->delete_meta_data('_shipping_method');
    $order->delete_meta_data('_shipping_methods');
    $order->save();
}

3. Если нужно отключать доставку только для определенных товаров

Добавим проверку на товары цифрового типа (например, у которых есть мета _virtual = yes), чтобы не отключать доставку для остальных заказов.

function disable_shipping_for_virtual_products($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $has_virtual = false;
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && $product->is_virtual()) {
            $has_virtual = true;
            break;
        }
    }

    if ($has_virtual) {
        // Очищаем доставку
        $order->set_shipping_address_1('');
        $order->set_shipping_address_2('');
        $order->set_shipping_city('');
        $order->set_shipping_postcode('');
        $order->set_shipping_country('');
        $order->set_shipping_state('');
        $order->set_shipping_total(0);
        $order->set_shipping_tax(0);
        $order->delete_meta_data('_shipping_method');
        $order->delete_meta_data('_shipping_methods');
        $order->save();
    }
}
add_action('woocommerce_order_status_processing', 'disable_shipping_for_virtual_products');
add_action('woocommerce_order_status_completed', 'disable_shipping_for_virtual_products');

Проверка результата после внедрения

Чтобы убедиться, что отгрузка отключена:

  • Создайте тестовый заказ с цифровым товаром;
  • Оплатите заказ тестовой оплатой;
  • Перейдите в админку WooCommerce и откройте заказ;
  • Проверьте, что поля доставки пусты, а стоимость доставки равна 0;
  • Проверьте, что уведомления о доставке не отправляются (если настроены);
  • Проверьте, что заказы с физическими товарами не затронуты;
  • Проверьте логи ошибок и консоль браузера на предмет сбоев.

Частые ошибки и как их исправить

  • Код не срабатывает: Проверьте, что код добавлен в правильное место и активен. Убедитесь, что хук соответствует статусу заказа, который реально присваивается после оплаты.
  • Отгрузка не очищается полностью: Возможно, другие плагины или темы добавляют свои данные доставки. Проверьте метаданные заказа через базу или плагины типа WP-CLI.
  • Поля доставки возвращаются после обновления заказа: Может срабатывать кеширование или автоматические процессы. Попробуйте отключить кеш и пересохранить заказ вручную.
  • Ошибка при сохранении заказа: Убедитесь, что объект заказа корректно получен и что нет конфликтов с другими хуками.

Практические советы по производительности и безопасности

  • Не используйте тяжелые SQL-запросы внутри хуков обновления заказа — лучше работать с объектом WC_Order.
  • Проверяйте наличие объекта заказа перед выполнением операций.
  • Код сохраняйте в дочерней теме или отдельном плагине, чтобы не потерять при обновлении.
  • Используйте фильтры WooCommerce для кастомизации, если нужно менять поведение дальше.
  • Тестируйте изменения на копии сайта, чтобы не повлиять на работу магазина в рабочем режиме.

Сравнение вариантов решения

МетодПлюсыМинусыКогда использовать
Код на хуках (как в статье)Гибкость, быстрое внедрение, не требует плагиновНужны базовые знания PHP, возможны конфликтыДля кастомных решений под магазин
Плагины для цифровых товаров (например, WooCommerce Digital Downloads)Готовое решение, поддержкаМожет быть избыточно для простых задач, платныеДля крупных проектов с цифровым контентом
Отключение доставки в настройках товаровПросто, не требует кодаНе всегда удобно для смешанных заказовЕсли все товары одного типа
WooCommerce: как исправить ошибку неправильного отображения стоимости в корзине
08.06.2026
Как отключить автопроигрывание видео в блоках Gutenberg в WordPress
16.02.2026
Как создать собственный шорткод в WordPress
10.11.2025
Как использовать REST API WordPress для создания собственных приложений
13.11.2025
WooCommerce: как эффективно очистить базу от старых корзин и заказов
23.05.2026