В чем проблема с оформлением заказа при отсутствии товара на складе?
WooCommerce по умолчанию позволяет добавить товар в корзину и перейти к оформлению заказа даже если товар закончился на складе или его количество недостаточно. Это приводит к путанице у пользователей и увеличивает количество отменённых заказов. Чтобы избежать этого, нужно автоматически перенаправлять пользователя с оформления заказа на страницу с сообщением или каталог, если в корзине есть товары с нулевым или отрицательным остатком.
Диагностика ситуации: как проверить наличие товаров без запаса в корзине
Первый шаг — проверить, есть ли в корзине товары с недоступным запасом. Для этого можно использовать WooCommerce функцию WC()->cart->get_cart() и для каждого элемента корзины проверить значение $product->get_stock_quantity() и $product->is_in_stock().
function cart_has_out_of_stock_items() {
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
if ( ! $product->is_in_stock() || $product->get_stock_quantity() <= 0 ) {
return true;
}
}
return false;
}Пошаговое решение: автоматический редирект при отсутствии товаров на складе
1. Подключаем редирект на странице оформления заказа
Используем хук template_redirect для проверки состояния корзины и перенаправления.
add_action('template_redirect', 'redirect_if_out_of_stock_in_cart');
function redirect_if_out_of_stock_in_cart() {
if ( is_checkout() && ! is_wc_endpoint_url() && WC()->cart ) {
if ( cart_has_out_of_stock_items() ) {
wp_safe_redirect( wc_get_page_permalink( 'shop' ) );
exit;
}
}
}2. Создаем пользовательское уведомление
Чтобы пользователь понимал причину редиректа, добавим уведомление на страницу магазина через сессионное сообщение WooCommerce.
add_action('wp_loaded', 'add_out_of_stock_notice');
function add_out_of_stock_notice() {
if ( isset($_GET['out_of_stock_redirect']) ) {
wc_add_notice('В корзине есть товары, которые отсутствуют на складе. Пожалуйста, удалите их перед оформлением заказа.', 'error');
}
}Изменим редирект с добавлением параметра:
wp_safe_redirect( wc_get_page_permalink( 'shop' ) . '?out_of_stock_redirect=1' );Проверка результата после внедрения
- Добавьте в корзину товар с нулевым запасом или отключенный товар.
- Перейдите на страницу оформления заказа (
/checkout/). - Убедитесь, что происходит автоматический редирект на страницу магазина.
- На странице магазина должно отображаться уведомление о необходимости удалить отсутствующие товары из корзины.
Частые ошибки и как их исправить
- Редирект не срабатывает: Проверьте, что хук
template_redirectподключен в правильном файле темы или плагина, и что WooCommerce корзина инициализирована (WC()->cartне равенnull). - Уведомление не отображается: Убедитесь, что вызов
wc_add_notice()происходит до вывода контента и что тема поддерживает вывод WooCommerce сообщений (do_action('woocommerce_before_shop_loop')или аналогично). - Редирект вызывает бесконечный цикл: Добавьте проверку, чтобы редирект не срабатывал, если пользователь уже на странице магазина или страницы, куда происходит редирект.
Практические советы по безопасности и производительности
- Используйте
wp_safe_redirect()вместоwp_redirect()для предотвращения редиректа на внешние сайты. - Проверяйте, что корзина инициализирована и не пуста перед выполнением проверок, чтобы избежать ошибок PHP.
- Если на сайте много товаров и большая нагрузка, кешируйте результаты проверки наличия товаров в корзине для оптимизации.
- Рекомендуется протестировать решение на тестовом стенде, чтобы избежать проблем с пользовательским опытом на рабочем сайте.
Сравнение вариантов реализации редиректа
| Метод | Преимущества | Недостатки |
|---|---|---|
Редирект с помощью template_redirect и проверки наличия | Простой, не требует сторонних плагинов, гибкий | Нужно вручную настраивать уведомления и проверять все сценарии |
| Использование плагинов для управления наличием товаров в корзине | Часто имеют дополнительные функции уведомлений и блокировок | Могут влиять на производительность, требуют поддержки |
| Модификация шаблонов оформления заказа | Точное управление отображением и логикой | Требует знаний PHP и WooCommerce, сложнее в поддержке |