Почему важно автоматически отключать товары с нулевым остатком
В интернет-магазинах на WooCommerce отсутствие товара на складе может привести к негативному опыту покупателей, если товар всё ещё виден и доступен для заказа. Автоматическое отключение товаров с нулевым остатком позволяет избежать ошибок, уменьшить количество отменённых заказов и поддерживать актуальность каталога без необходимости постоянного ручного контроля.
Диагностика проблемы: как понять, что товары не отключаются при нулевом остатке
- Проверьте, доступны ли товары с остатком 0 для покупки на сайте.
- Убедитесь, что в настройках WooCommerce включён контроль запасов (WooCommerce > Настройки > Товары > Управление запасами).
- Запустите простой SQL-запрос в базе данных для проверки остатков:
SELECT ID, post_title, meta_value FROM wp_posts JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE meta_key = '_stock' AND meta_value = '0'; - Если товары с 0 на складе отображаются как активные и доступны, значит автоматическое отключение не настроено.
Пошаговое решение: отключение товаров с нулевым остатком через functions.php
Добавим код, который при обновлении запасов автоматически меняет статус товара на "черновик" (draft), если остаток равен нулю, и обратно на "опубликован" (publish), если запас появился.
add_action('woocommerce_update_product', 'auto_disable_out_of_stock_products', 10, 1);
function auto_disable_out_of_stock_products($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) {
if ($stock_quantity === 0) {
// Отключаем товар
if ($product->get_status() !== 'draft') {
$product->set_status('draft');
$product->save();
}
} elseif ($stock_quantity > 0) {
// Включаем товар
if ($product->get_status() !== 'publish') {
$product->set_status('publish');
$product->save();
}
}
}
}Этот код автоматически изменяет статус товара при изменении его остатков. Он сработает при любом обновлении товара через административную панель или программно.
Альтернативный вариант: cron-задача для массовой проверки
Если нужно массово проверять тысячи товаров, можно настроить cron-задачу, которая будет запускаться по расписанию:
add_action('auto_disable_out_of_stock_cron', 'auto_disable_out_of_stock_bulk');
function auto_disable_out_of_stock_bulk() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => ['publish', 'draft'],
];
$products = get_posts($args);
foreach ($products as $post) {
$product = wc_get_product($post->ID);
if (!$product) continue;
$stock_quantity = $product->get_stock_quantity();
$manage_stock = $product->managing_stock();
if ($manage_stock) {
if ($stock_quantity === 0 && $product->get_status() !== 'draft') {
$product->set_status('draft');
$product->save();
} elseif ($stock_quantity > 0 && $product->get_status() !== 'publish') {
$product->set_status('publish');
$product->save();
}
}
}
}
// Регистрируем cron, если ещё не зарегистрирован
if (!wp_next_scheduled('auto_disable_out_of_stock_cron')) {
wp_schedule_event(time(), 'hourly', 'auto_disable_out_of_stock_cron');
}Как проверить, что автоматическое отключение работает
- Обновите запас товара в админке: установите 0, сохраните, проверьте, что статус изменился на "черновик".
- Установите положительное значение запаса, сохраните, убедитесь, что статус товара стал "опубликован".
- Проверьте на сайте, что товары со статусом "черновик" не отображаются в каталоге.
- Если работает cron, проверьте логи и статус планировщика WP-Cron (например, с помощью плагина WP Crontrol).
Частые ошибки и как их исправить
- Код не срабатывает при импорте или массовом обновлении. В этом случае лучше использовать cron-задачу для регулярной проверки всех товаров.
- Товары с вариациями. Для вариативных товаров нужно дополнительно проверять остатки каждой вариации, так как у вариативного товара нет собственного запаса.
- Статус товара не меняется. Проверьте права пользователя и работу хуков. Убедитесь, что нет конфликтов с плагинами кэширования или оптимизации.
- Продукт остаётся видимым в каталоге. Проверьте настройки видимости и индексации товаров со статусом "черновик".
Практические советы по безопасности и производительности
- Не добавляйте тяжелые операции в хуки, которые вызываются часто — используйте cron-задачи для массовых изменений.
- Всегда проверяйте права пользователя, если добавляете интерфейс для включения/отключения товара.
- При большом каталоге используйте пакетную обработку, чтобы избежать таймаутов.
- Для вариативных товаров расширьте логику проверки остатков у вариаций, чтобы статус родительского товара соответствовал наличию хотя бы одного варианта в наличии.
- Для улучшения SEO используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpexperts.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-otklyuchenie-tovarov-s-nulevym-ostatkom-bez-plaginov) для правильной индексации и удаления дублирующего контента товаров со статусом "черновик".
Таблица сравнения решений для отключения товаров с нулевым остатком
| Способ | Преимущества | Недостатки |
|---|---|---|
Код на хуке woocommerce_update_product | Автоматическое срабатывание при обновлении, простота внедрения | Не работает при массовом импорте, не для вариативных товаров |
| Cron-задача для массовой проверки | Обрабатывает все товары, подходит для больших каталогов | Задержка между проверками, нагрузка на сервер при большом количестве товаров |
| Плагины (например, WooCommerce Stock Manager) | Готовое решение с UI, поддержка вариаций | Дополнительная нагрузка, возможные конфликты, лицензии |