Проблема: как убрать товары с нулевым остатком из каталога WooCommerce
В стандартных настройках WooCommerce товары с нулевым количеством на складе остаются видимыми в каталоге, если не включена опция скрытия. Это может негативно повлиять на пользовательский опыт и конверсию. Задача — автоматически удалять или скрывать такие товары, чтобы они не отображались покупателям и не засоряли каталог.
Диагностика текущего поведения WooCommerce
По умолчанию WooCommerce предоставляет две опции для управления товарами с нулевым остатком:
- Отключить продажи при отсутствии товара (
WooCommerce > Настройки > Товары > Управление запасами) — товары со статусом "нет в наличии" нельзя купить. - Скрыть товары, которые нет в наличии — эта галочка скрывает товар из каталога.
Проверить текущие настройки можно в административной панели. Если опция скрытия не активна, товары с нулевым остатком видны клиентам, что вызывает вопросы.
Если же нужно именно автоматическое удаление таких товаров (а не просто скрытие), стандартных средств WooCommerce недостаточно — потребуется доработка.
Пошаговое решение: автоматическое удаление товаров с нулевым остатком
1. Создаем WP-Cron задачу для регулярной проверки товаров
Добавим в functions.php вашей темы или в кастомный плагин следующий код для запуска задачи по удалению товаров без запаса:
if (!wp_next_scheduled('wc_delete_out_of_stock_products')) {
wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_products');
}
add_action('wc_delete_out_of_stock_products', 'wc_remove_out_of_stock_products');
function wc_remove_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
'fields' => 'ids',
];
$out_of_stock_products = get_posts($args);
foreach ($out_of_stock_products as $product_id) {
wp_trash_post($product_id); // перемещаем в корзину, чтобы была возможность восстановления
}
}2. Запуск задачи вручную для теста
Для проверки кода можно временно вызвать функцию вручную:
add_action('admin_init', function() {
if (current_user_can('administrator') && isset($_GET['run_wc_delete'])) {
wc_remove_out_of_stock_products();
echo 'Удаление товаров с нулевым остатком выполнено';
exit;
}
});Перейдите в админку WordPress и добавьте к URL ?run_wc_delete=1, например: https://example.com/wp-admin/?run_wc_delete=1. Функция удалит все товары со статусом "outofstock".
3. Автоматизация и настройка расписания
WP-Cron по умолчанию запускается при заходе на сайт, что может быть ненадежно на низкоскоростных или малопосещаемых сайтах. Для более точного расписания рекомендуем настроить системный cron (Linux) и отключить WP-Cron:
- в
wp-config.phpдобавитьdefine('DISABLE_WP_CRON', true); - создать cron-задачу на сервере, например, запускать
wget -q -O - https://example.com/wp-cron.php?doing_wp_cronраз в сутки
Проверка результата
Чтобы убедиться, что удаление работает:
- Создайте тестовый товар с нулевым остатком.
- Вызовите функцию вручную через
?run_wc_delete=1или дождитесь запуска cron. - Проверьте, что товар перемещен в корзину (раздел "Корзина" в админке).
- Проверьте фронтенд — товар не должен отображаться в каталоге.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, что статус запаса действительно
outofstock. Иногда у товаров может быть неправильный мета-ключ или статусinstock, но с нулевым количеством на складе. - WP-Cron не запускается: проверьте, не отключен ли WP-Cron, или настройте системный cron для надежности.
- Удаление окончательное, а не в корзину: используйте
wp_trash_post(), а неwp_delete_post(), чтобы можно было восстановить товары при ошибке. - Пропадают товары с положительным остатком: проверьте meta_query, чтобы строго фильтровать только
_stock_status = 'outofstock'.
Практические советы по безопасности и производительности
- Резервное копирование: перед автоматическим удалением товаров сделайте резервную копию базы, чтобы избежать потери данных.
- Оптимизация запросов: при большом каталоге используйте постраничный запрос и пакетное удаление, чтобы избежать таймаутов.
- Логирование: добавьте логирование действий для контроля выполнения задачи, например, через error_log или пользовательские записи в таблицу базы.
- Проверка зависимостей: убедитесь, что автоматическое удаление не ломает связи с заказами и отчетами WooCommerce.
Альтернативные подходы: скрытие vs удаление товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Скрытие товаров (опция WooCommerce) | Простота, не теряются данные, можно вернуть | Товар занимает место в базе, может быть виден в поиске |
| Автоматическое удаление (код) | Чистый каталог, меньше нагрузки на фронтенд | Риск потери данных, сложнее восстановить, требует резервного копирования |
| Использование плагинов (например, Clearfy Pro для очистки) | Удобство, дополнительные функции оптимизации | Потенциальные конфликты, стоимость |