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

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

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

Диагностика проблемы: почему WooCommerce продолжает считать товар требующим отгрузки?

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

  • Тип товара в карточке: физический или виртуальный?
  • Отсутствует ли флаг virtual у товара, если он не требует доставки?
  • Не меняется ли статус заказа или метаданные, связанные с доставкой, автоматически после оплаты?
  • Есть ли сторонние плагины, которые влияют на логику отгрузки?

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

Для автоматического отключения отгрузки нужно программно установить свойство virtual для товаров в заказе либо изменить логику обработки заказа после оплаты. Рассмотрим пошаговое решение с использованием хука woocommerce_order_status_completed, который срабатывает после успешного завершения оплаты.

Шаг 1. Добавить функцию для отметки товаров как виртуальных

add_action('woocommerce_order_status_completed', 'wpone_disable_shipping_after_payment', 10, 1);
function wpone_disable_shipping_after_payment($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;
    
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && !$product->is_virtual()) {
            // Отмечаем товар как виртуальный
            $product->set_virtual(true);
            $product->save();
        }
    }
}

Этот код изменяет статус товаров на виртуальные при завершении оплаты заказа, что отключает требование доставки.

Шаг 2. Проверка и очистка метаданных заказа

Кроме изменения свойства товара, важно убрать из заказа данные, связанные с доставкой:

add_action('woocommerce_order_status_completed', 'wpone_clear_shipping_data', 20, 1);
function wpone_clear_shipping_data($order_id) {
    $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_state('');
    $order->set_shipping_country('');
    
    // Очищаем выбранный способ доставки
    $order->set_shipping_method('');
    
    $order->save();
}

Как проверить, что автоматическое отключение отгрузки работает

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

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

  • Товары не становятся виртуальными: возможно, хук срабатывает слишком поздно или функция не вызывается. Проверьте, что код подключен в functions.php вашей темы или в плагине, и что нет ошибок в логах PHP.
  • Поля доставки не очищаются: убедитесь, что используете правильные методы объекта WC_Order и вызываете $order->save() после изменений.
  • Изменения влияют на все заказы: добавьте условия, например, проверку категории товара или метаданных, чтобы отключать доставку только для нужных товаров.
  • Проблемы с кешированием: если сайт использует кеш или CDN, обновления могут отображаться с задержкой. Очистите кеш после внесения изменений.

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

  • Изменение свойства virtual у товаров глобально влияет на сам товар, а не только на заказ. Если нужно отключать доставку только для конкретных заказов, лучше работать с метаданными заказа, а не с самим товаром.
  • Для массовых изменений используйте WP CLI или отдельные скрипты, чтобы не нагружать сайт во время оформления заказа.
  • Используйте проверку условий, например, по категории или тегу, чтобы избежать ошибок на сайтах с разнородным ассортиментом.
  • Тестируйте на staging-сайте перед внедрением на рабочем.

Сравнение вариантов реализации отключения доставки

МетодПлюсыМинусыКогда использовать
Изменение свойства virtual у товараПростая реализация, отключает доставку полностьюВлияет на товар глобально, не подходит для выборочных заказовДля полностью цифровых товаров или сервисов
Очищение метаданных доставки в заказеГибко для отдельных заказов, не меняет товарТребует более сложной логики и тестированияДля смешанных магазинов с физическими и цифровыми товарами
Использование плагинов для управления логикой доставкиУдобство настройки без кодаЗависимость от сторонних решений, нагрузка на сайтДля непрофессиональных разработчиков или быстрых решений
Как использовать метод WPONE REST API для получения данных пользователя в WordPress
22.01.2026
Как вывести оценки пользователей в WordPress с помощью плагинов и кода
25.02.2026
Как создать автоматический резервный копировщик в WordPress без плагинов
30.03.2026
Как использовать WPONE AJAX в WordPress для динамического обновления контента
06.12.2025
Как вывести многоязычный контент в WordPress с помощью WPML
30.03.2026