wpcat.ru wordpress WPCat.ru

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

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

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

Диагностика проблемы: почему товары не отключаются автоматически

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

Для диагностики:

  • Перейдите в WooCommerce → Настройки → Товары → Запасы и проверьте, включено ли управление запасами и отключены ли заказы при отсутствии товара.
  • Проверьте, правильно ли ведется учет запасов у товаров и их вариаций.
  • Убедитесь, что у товаров нет статуса «В наличии», если количество равно 0.

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

Решение состоит в добавлении кода, который при обновлении количества на складе будет менять статус товара на «черновик» (или другой скрытый статус), если товар отсутствует на складе. Аналогично можно сделать и для вариаций.

1. Функция для отключения простых товаров

add_action('woocommerce_product_set_stock', 'auto_disable_product_if_out_of_stock', 10, 1);function auto_disable_product_if_out_of_stock($product) {    if (!$product instanceof WC_Product) {        $product = wc_get_product($product);    }    if (!$product) {        return;    }    $stock_quantity = $product->get_stock_quantity();    $manage_stock = $product->get_manage_stock();    if ($manage_stock && $stock_quantity !== null && $stock_quantity <= 0) {        // Меняем статус на черновик        $product->set_status('draft');        $product->save();    } else {        // Восстанавливаем статус публикации, если есть товар на складе        if ($product->get_status() === 'draft') {            $product->set_status('publish');            $product->save();        }    }}

2. Аналогичная функция для вариаций товаров

add_action('woocommerce_variation_set_stock', 'auto_disable_variation_if_out_of_stock', 10, 1);function auto_disable_variation_if_out_of_stock($variation) {    if (!$variation instanceof WC_Product_Variation) {        $variation = wc_get_product($variation);    }    if (!$variation) {        return;    }    $stock_quantity = $variation->get_stock_quantity();    $manage_stock = $variation->get_manage_stock();    if ($manage_stock && $stock_quantity !== null && $stock_quantity <= 0) {        $variation->set_status('draft');        $variation->save();    } else {        if ($variation->get_status() === 'draft') {            $variation->set_status('publish');            $variation->save();        }    }}

Этот код добавляется в файл functions.php активной темы или в кастомный плагин.

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

  1. Обновите количество товара или вариации на складе через админку WooCommerce, установив 0 или меньше.
  2. Проверьте, что статус товара (или вариации) изменился на «черновик» (Draft). Его не будет видно на фронтенде.
  3. Увеличьте количество на складе, обновите — статус должен автоматически вернуться в «опубликован» (Publish), и товар снова станет видимым.
  4. Обновите страницу с каталогом и убедитесь, что отсутствующие товары не отображаются.

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

  • Код не срабатывает при обновлении запаса: Проверьте, действительно ли вы обновляете количество через интерфейс WooCommerce, а не через прямые SQL-запросы. Хуки woocommerce_product_set_stock и woocommerce_variation_set_stock срабатывают только при обновлении через WC API.
  • Статус товара не меняется: Убедитесь, что у вашего пользователя есть права на редактирование товара. Добавьте отладочный вывод через error_log внутри функций, чтобы проверить вызов.
  • Вариации не отключаются: Проверьте, что вы используете правильный хук для вариаций woocommerce_variation_set_stock.
  • Невозможно увидеть изменения на сайте: Очистите кэш сайта и браузера, особенно если используете плагины кеширования.

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

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

Сравнение вариантов реализации автоматического отключения товаров

ВариантПлюсыМинусыКомпромисс
Плагин управления запасамиПростая установка, готовые функцииНагрузка на сайт, возможные конфликтыИспользовать только проверенные плагины
Кастомный код (описанный выше)Легкий, гибкий, без сторонних зависимостейТребует навыков разработки и тестированияОптимально для опытных разработчиков
Ручное скрытие товаровМаксимальный контрольТрудозатратно, возможны ошибкиПодходит для небольших магазинов
×

Время действовать!

Суперцены на
WordPress!

-20%
на премиум темы

Не упусти шанс ⋙