Проблема: товары остаются активными при отсутствии на складе
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары, которых нет в наличии, продолжают отображаться и быть доступными для заказа. Это приводит к негативному пользовательскому опыту и увеличивает количество отменённых заказов.
WooCommerce по умолчанию не отключает товар автоматически при достижении запаса 0, если не включена соответствующая настройка. В этой статье разберём, как реализовать автоматическое отключение товаров, когда их запас исчерпан.
Диагностика проблемы: почему товары не отключаются при 0 на складе
- Проверка настроек WooCommerce:
WooCommerce > Настройки > Товары > Запасы— параметр Включить управление запасами должен быть активен. - Параметр Разрешить заказ при отсутствии товара должен быть выключен, чтобы товар не заказывался при отсутствии.
- Проверка статуса товара: даже при 0 на складе статус товара может оставаться
publish, если не настроено автоматическое управление статусом. - Если используется сторонний плагин управления складом, он может переопределять логику WooCommerce.
Пошаговое решение: автоматическое отключение товаров при 0 на складе
1. Включаем управление запасами в WooCommerce
Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что опция Включить управление запасами активирована.
2. Отключаем возможность заказа при отсутствии товара
В том же разделе снимите галочку с Разрешить заказ при отсутствии товара.
3. Добавляем пользовательский код для автоматического отключения товаров
WooCommerce не меняет автоматически статус товара на «черновик» или «отключено» при достижении запаса 0, поэтому добавим хук для автоматической деактивации.
add_action('woocommerce_reduce_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);
}
// Проверяем, если запас 0 или меньше
if ($product->get_stock_quantity() <= 0) {
// Меняем статус товара на 'draft' (черновик)
$post = get_post($product->get_id());
if ($post->post_status !== 'draft') {
wp_update_post([
'ID' => $product->get_id(),
'post_status' => 'draft'
]);
}
}
}
Этот код слушает событие уменьшения запаса и переводит товар в черновик, если запас исчерпан.
4. Обработка изменения запасов вручную и через импорт
Если запасы меняются через админку или импорт, вышеуказанный хук не сработает. Для этого добавим проверку при сохранении товара:
add_action('save_post_product', 'check_stock_and_disable_product', 20, 3);
function check_stock_and_disable_product($post_id, $post, $update) {
if (wp_is_post_revision($post_id)) return;
$product = wc_get_product($post_id);
if (!$product) return;
if ($product->get_stock_quantity() <= 0) {
if ($post->post_status !== 'draft') {
// Меняем статус
remove_action('save_post_product', 'check_stock_and_disable_product', 20);
wp_update_post([
'ID' => $post_id,
'post_status' => 'draft'
]);
add_action('save_post_product', 'check_stock_and_disable_product', 20, 3);
}
} else {
// Если запас появился, переводим обратно в опубликованный статус
if ($post->post_status === 'draft') {
remove_action('save_post_product', 'check_stock_and_disable_product', 20);
wp_update_post([
'ID' => $post_id,
'post_status' => 'publish'
]);
add_action('save_post_product', 'check_stock_and_disable_product', 20, 3);
}
}
}
Проверка результата после внедрения
- Создайте тестовый продукт с запасом 1.
- Сделайте заказ, чтобы уменьшить запас до 0, или вручную установите запас в 0 через админку.
- Проверьте, что статус товара автоматически изменился на
черновики товар исчез с витрины. - Увеличьте запас обратно и проверьте, что товар возвращается в опубликованный статус.
Частые ошибки и как их исправить
- Код не срабатывает при изменении запаса через импорт — добавьте проверку на сохранение товара (как показано в шаге 4).
- Товар остаётся видимым после установки запаса 0 — проверьте, включено ли управление запасами в настройках WooCommerce.
- Конфликт с плагинами управления складом — временно отключите сторонние плагины и проверьте работу кода.
- Статус товара меняется, но товар всё равно отображается — проверьте, не используется ли кэширование страниц или сторонние кэш-плагины, очистите кеш.
Практические советы по производительности и безопасности
- Добавляйте код в дочернюю тему
functions.phpили в отдельный site-specific плагин, чтобы не потерять изменения при обновлении. - Используйте
remove_actionиadd_actionпри обновлении статуса, чтобы избежать рекурсии. - При большом количестве товаров и частых заказах рассмотрите оптимизацию: кеширование запросов и асинхронную обработку статусов через WP-Cron.
- Проверяйте права доступа, чтобы код не запускался на фронтенде без необходимости.
Сравнение способов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Настройки WooCommerce | Простая настройка без кода | Не отключает товар, только запрещает заказ |
Код на хуках (woocommerce_reduce_stock, save_post_product) | Автоматически меняет статус товара, скрывая его полностью | Требует поддержки и тестирования при обновлениях |
| Сторонние плагины управления запасами | Дополнительный функционал, отчеты, интеграции | Могут конфликтовать, создавать нагрузку |