Диагностика проблемы: почему важно отключать товары без остатков
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары остаются в статусе "в продаже", несмотря на то, что их количество на складе достигло нуля. Это негативно влияет на пользовательский опыт и может привести к потерям продаж и недовольству клиентов. Поэтому автоматизация отключения товаров без остатков — важная задача.
Как понять, что товары не отключаются при нуле остатков?
- На странице каталога видны товары с количеством 0 и возможностью добавить их в корзину.
- В админке WooCommerce в списке товаров статус — "В наличии", а количество равно 0.
- Клиенты жалуются на невозможность оформить заказ по товару, который отображается как доступный.
Пошаговое решение: автоматическое отключение товаров без остатков
Самый надежный способ — добавить кастомный код, который при обновлении запаса товара проверяет остаток и меняет статус товара на "черновик" или "нет в наличии".
Шаг 1. Подключение функции на хук сохранения товара
add_action('woocommerce_update_product', 'auto_disable_out_of_stock_product', 10, 1);
function auto_disable_out_of_stock_product($product_id) {
$product = wc_get_product($product_id);
if (!$product) return;
$stock_quantity = $product->get_stock_quantity();
$manage_stock = $product->managing_stock();
if ($manage_stock && $stock_quantity <= 0) {
// Меняем статус на 'draft' — товар скрыт из каталога
$post = [
'ID' => $product_id,
'post_status' => 'draft'
];
wp_update_post($post);
}
}Эта функция автоматически переводит товар в статус "черновик", если количество на складе равно нулю или меньше.
Шаг 2. Добавление проверки для вариативных товаров
Для вариативных товаров нужно проверять остатки по всем вариантам:
add_action('woocommerce_update_product', 'auto_disable_out_of_stock_variable_product', 20, 1);
function auto_disable_out_of_stock_variable_product($product_id) {
$product = wc_get_product($product_id);
if (!$product || $product->get_type() !== 'variable') return;
$variations = $product->get_children();
$out_of_stock = true;
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->managing_stock() && $variation->get_stock_quantity() > 0) {
$out_of_stock = false;
break;
}
}
if ($out_of_stock) {
wp_update_post(['ID' => $product_id, 'post_status' => 'draft']);
}
}Проверка результата после внедрения
- Обновите остаток товара через админку WooCommerce — установите 0 или меньше.
- Обновите страницу каталога — товар должен исчезнуть из списка.
- Проверьте статус товара в админке — должен быть "черновик".
- Для вариативных товаров проверьте, что товар отключается только если все варианты без остатков.
Частые ошибки и как их исправить
- Товары не скрываются: убедитесь, что код подключен в functions.php активной темы или в плагине, и что хук
woocommerce_update_productсрабатывает. - Статус товара меняется, но он все равно виден на сайте: проверьте кэш сайта и плагинов кэширования, очистите его.
- Вариативные товары отключаются при наличии хотя бы одного варианта в наличии: проблема в логике проверки — убедитесь, что проверка идет по всем вариантам и отключение происходит только когда все варианты без стоков.
- Нарушается логика отображения товаров с "разрешенным" заказом при отсутствии стока: если включена опция "Разрешить заказы при отсутствии стока", код нужно адаптировать для учета этого параметра.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или в отдельный плагин, чтобы изменения не пропали при обновлении.
- Используйте
wc_get_product()для корректной работы с данными WooCommerce. - Обрабатывайте только измененные товары, чтобы избежать лишних вызовов и нагрузок.
- Очищайте кэш после изменения статуса товара, чтобы изменения отображались клиентам.
- Тестируйте на тестовом стенде перед внедрением на боевой сайт.
Сравнение вариантов реализации отключения товаров без остатков
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Код на хуке woocommerce_update_product | Автоматическое изменение статуса товара при обновлении | Полный контроль, без сторонних плагинов | Требуется базовый PHP, может не работать с импортом |
| Плагин для управления запасами | Использование готового решения с настройками | Простота настройки, поддержка | Дополнительная нагрузка, возможные конфликты |
| Ручное управление | Отключение товаров вручную | Простота для малого ассортимента | Не подходит для больших магазинов, риск ошибки |