wpcoding.ru wordpress WP Coding

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

Проблема: заказ товаров, которых нет в наличии

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

Диагностика проблемы

Чтобы убедиться, что проблема с заказом отсутствующих товаров именно у вас, проверьте следующее:

  • В настройках WooCommerce включено ли управление запасами (WooCommerce > Настройки > Товары > Управление запасами).
  • Для конкретных товаров в карточках задано количество на складе и включена опция управления запасами.
  • В процессе оформления заказа клиент может добавить в корзину количество, превышающее остаток.
  • Нет ли кастомных плагинов или кода, которые отключают проверку наличия.

Пошаговое решение: автоматическая проверка и блокировка заказа отсутствующих товаров

1. Включите управление запасами в WooCommerce

Перейдите в WooCommerce > Настройки > Товары > Управление запасами и активируйте «Включить управление запасами». Укажите параметры удержания запасов (например, 60 минут), если нужно.

2. Добавьте проверку наличия товаров при оформлении заказа с помощью хука woocommerce_checkout_process

В файле functions.php вашей темы или в кастомном плагине добавьте следующий код, который блокирует оформление заказа, если в корзине есть товары с нехваткой на складе:

add_action('woocommerce_checkout_process', 'wpc_check_stock_before_checkout');
function wpc_check_stock_before_checkout() {
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        $quantity = $cart_item['quantity'];

        if ($product->managing_stock() && !$product->has_enough_stock($quantity)) {
            wc_add_notice(sprintf('Товар "%s" доступен в количестве %d, но в корзине указано %d.', $product->get_name(), $product->get_stock_quantity(), $quantity), 'error');
        }
    }
}

3. (Опционально) Предотвратите добавление в корзину товаров с недостатком

Чтобы сразу блокировать добавление в корзину, используйте фильтр woocommerce_add_to_cart_validation:

add_filter('woocommerce_add_to_cart_validation', 'wpc_validate_stock_on_add_to_cart', 10, 3);
function wpc_validate_stock_on_add_to_cart($passed, $product_id, $quantity) {
    $product = wc_get_product($product_id);
    if ($product->managing_stock() && !$product->has_enough_stock($quantity)) {
        wc_add_notice('Извините, товара "' . $product->get_name() . '" недостаточно на складе.', 'error');
        return false;
    }
    return $passed;
}

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

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

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

  • Ошибка: Проверка не срабатывает, заказ все равно создается.
    Причина: Кэширование страниц оформления заказа или корзины, либо конфликт с другими плагинами.
    Решение: Отключите кэширование для страниц корзины и оформления заказа, временно деактивируйте плагины, влияющие на корзину.
  • Ошибка: Сообщения об ошибках не отображаются.
    Причина: В теме отсутствует вызов функции wc_print_notices() в шаблонах корзины/чекаута.
    Решение: Проверьте и добавьте эту функцию в нужные шаблоны.
  • Ошибка: Некорректное поведение при вариациях товаров.
    Причина: Неправильное получение объекта товара для вариаций.
    Решение: Используйте wc_get_product($variation_id) для вариаций в проверках.

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

  • Не используйте слишком тяжелые проверки в хуках оформления заказа, чтобы не замедлять процесс.
  • Кэширование страниц корзины и чекаута должно быть отключено, иначе результаты проверки будут некорректными.
  • Регулярно обновляйте WooCommerce и плагины, чтобы избежать несовместимостей.
  • Для сайтов с высокой нагрузкой рассмотрите использование специализированных сервисов для управления запасами и синхронизации с внешними системами.

Сравнение способов проверки наличия товаров в WooCommerce

МетодГде реализуетсяПлюсыМинусы
Стандартные настройки WooCommerceАдминка WooCommerceПростота настройки, встроенная поддержкаНе всегда блокирует заказ, если есть кастомный код
Проверка при добавлении в корзину (код)functions.phpБлокирует сразу, улучшает UXНе защищает, если товар изменили после добавления
Проверка при оформлении заказа (код)functions.phpГарантирует проверку перед оплатойОшибка появляется позже, можно потерять клиента
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше