Что значит автоматическое отключение отгрузки товара в 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 у товара | Простая реализация, отключает доставку полностью | Влияет на товар глобально, не подходит для выборочных заказов | Для полностью цифровых товаров или сервисов |
| Очищение метаданных доставки в заказе | Гибко для отдельных заказов, не меняет товар | Требует более сложной логики и тестирования | Для смешанных магазинов с физическими и цифровыми товарами |
| Использование плагинов для управления логикой доставки | Удобство настройки без кода | Зависимость от сторонних решений, нагрузка на сайт | Для непрофессиональных разработчиков или быстрых решений |