Проблема: почему важно отключать доставку при отсутствии товаров
В интернет-магазинах на 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 |