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

Проблема: почему важно отключать доставку при отсутствии товаров

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

Как диагностировать проблему с доступностью доставки в WooCommerce

Для начала проверьте, корректно ли настроен учёт запасов в WooCommerce:

  • Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что включено управление запасами.
  • Проверьте, что для товаров указано актуальное количество на складе.
  • Создайте тестовый заказ с товаром, у которого количество на складе равно нулю или меньше минимального.
  • Посмотрите, отображаются ли варианты доставки на странице оформления заказа.

Если доставка отображается, несмотря на отсутствие товара, значит, нужно внедрять логику фильтрации методов доставки.

Пошаговое решение: отключение вариантов доставки при отсутствии товаров

1. Создаём функцию для проверки наличия товаров в корзине

function wpf_check_cart_stock() {
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        if ( ! $product->is_in_stock() || $product->get_stock_quantity() < 1 ) {
            return false; // Есть товар без запаса
        }
    }
    return true; // Все товары в наличии
}

2. Фильтруем доступные методы доставки

add_filter( 'woocommerce_package_rates', 'wpf_disable_shipping_if_out_of_stock', 10, 2 );
function wpf_disable_shipping_if_out_of_stock( $rates, $package ) {
    if ( ! wpf_check_cart_stock() ) {
        // Отключаем все методы доставки
        return [];
    }
    return $rates;
}

3. Добавляем уведомление пользователю

add_action( 'woocommerce_checkout_process', 'wpf_show_notice_if_no_stock' );
function wpf_show_notice_if_no_stock() {
    if ( ! wpf_check_cart_stock() ) {
        wc_add_notice( 'Извините, один или несколько товаров отсутствуют на складе. Доставка недоступна.', 'error' );
    }
}

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

  • Добавьте в корзину товар с нулевым запасом.
  • Перейдите на страницу оформления заказа.
  • Убедитесь, что список доступных способов доставки пуст или отсутствует.
  • Проверьте, что выводится сообщение об ошибке с информированием пользователя.
  • Попробуйте добавить товар с запасом — доставка должна отобразиться.

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

  • Функция не учитывает вариации товаров: В случае вариативных товаров нужно проверять запасы вариаций, а не родительского товара. Используйте $product->get_stock_quantity() для конкретного варианта.
  • Кэширование мешает обновлению данных: Если вы используете кэширование страниц, убедитесь, что корзина и страницы оформления заказа не кэшируются.
  • Плагины доставки конфликтуют с фильтром: Проверьте приоритет фильтра или отключите нестандартные плагины доставки для теста.
  • Пользователь не видит сообщение об ошибке: Проверьте, что вызов wc_add_notice происходит до рендера страницы оформления заказа.

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

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

Сравнение вариантов реализации фильтрации доставки

МетодПреимуществаНедостатки
Код на functions.phpЛегко кастомизировать, не требует плагинов, быстро внедряетсяПри обновлении темы код может слететь, требует базовых знаний PHP
Плагин для управления доставкойГрафический интерфейс, дополнительные настройки, поддержкаМожет замедлить сайт, не всегда бесплатно, избыточен для простой задачи
Использование хуков WooCommerceГибкость, интеграция с другими функциями магазинаТребует понимания внутренней логики WooCommerce
WooCommerce: автоматическое отключение способа оплаты при отсутствии товара на складе
04.07.2026
WooCommerce: автоматическое изменение цены товара при изменении количества
01.07.2026
Как создать автоматический импорт постов из RSS в WordPress
30.03.2026
Как отключить автоматические обновления в WordPress
13.04.2026
Как автоматически удалять старые черновики в WordPress
23.12.2025