Диагностика проблемы: почему товары с нулевым запасом остаются в каталоге
В стандартной конфигурации WooCommerce товары с нулевым запасом не удаляются автоматически из каталога. Это может привести к появлению неактуальных товаров, ухудшению пользовательского опыта и снижению конверсии. Часто пользователи замечают, что даже при отключенном отображении товаров без наличия, такие позиции остаются в поиске или в списках, если настройки не до конца корректны.
Чтобы убедиться в наличии проблемы, проверьте следующие моменты:
- В настройках WooCommerce в разделе «Товары» > «Запасы» опция «Скрыть товары без наличия» включена?
- Товары действительно имеют запас 0 и статус "в наличии" или "нет в наличии"?
- Кэш сайта и кэш плагинов очищен после изменения настроек?
Пошаговое решение: автоматическое удаление товаров с нулевым запасом через код
1. Создаем функцию для удаления товаров с запасом 0
Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:
function wc_remove_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC',
],
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
]
],
'fields' => 'ids',
];
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_trash_post($product_id); // Можно заменить на wp_delete_post для полного удаления
}
}
}2. Запускаем функцию автоматически по расписанию
Добавим задачу WP-Cron, чтобы функция запускалась, например, раз в сутки:
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('wc_daily_remove_out_of_stock')) {
wp_schedule_event(time(), 'daily', 'wc_daily_remove_out_of_stock');
}
// Добавляем обработчик события
add_action('wc_daily_remove_out_of_stock', 'wc_remove_out_of_stock_products');3. Как запустить удаление вручную для проверки
Для тестирования добавьте на время вызов функции в functions.php и затем удалите, чтобы не вызывать при каждом запросе:
add_action('init', 'wc_remove_out_of_stock_products');Проверка результата после внедрения
Чтобы убедиться, что решение работает:
- Подождите выполнение cron-задачи или вручную вызовите функцию.
- Перейдите в админку WooCommerce > Товары и убедитесь, что товары с запасом 0 перемещены в корзину или удалены.
- Проверьте фронтенд сайта — этих товаров не должно отображаться в каталоге и поиске.
- Если используется кэширование, очистите кэш страницы и объектов.
Частые ошибки и способы их устранения
- Функция не запускается по расписанию: Проверьте, активен ли WP-Cron (например, вызовите
wp cron event listчерез WP-CLI), и не отключен ли он вwp-config.php. - Товары не удаляются: Возможно, статус товара не "outofstock". Проверьте в таблице
wp_postmetaзначение мета-поля_stock_status. Можно временно убрать условие по статусу для диагностики. - Удаление приводит к потере данных: Используйте
wp_trash_post()вместоwp_delete_post(), чтобы иметь возможность восстановить товары. - Кэш мешает видеть изменения: Очистите кэш плагинов, CDN и браузера.
Практические советы по безопасности и производительности
- Не запускайте удаление при каждом запросе — используйте WP-Cron с интервалом не чаще одного раза в день.
- Перед массовым удалением сделайте резервную копию базы данных.
- При большом количестве товаров разбивайте удаление на порции, чтобы избежать таймаутов:
function wc_remove_out_of_stock_products_batch() {
$args = [
'post_type' => 'product',
'posts_per_page' => 50, // порция по 50 товаров
'meta_query' => [
[ 'key' => '_stock', 'value' => '0', 'compare' => '=', 'type' => 'NUMERIC' ],
[ 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => '=' ]
],
'fields' => 'ids',
];
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_trash_post($product_id);
}
}
return count($products);
}Используйте такой подход с повторным вызовом, пока функция не вернет 0.
Сравнение подходов удаления товаров с нулевым запасом
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Плагин (например, Custom Stock Manager) | Использование готового решения с настройками | Простота установки, интерфейс | Зависимость от стороннего кода, нагрузка |
| Код в functions.php с WP-Cron | Автоматическое удаление через кастомный код | Полный контроль, отсутствие сторонних плагинов | Требует навыков, возможны ошибки при реализации |
| Ручное удаление | Удаление товаров вручную в админке | Простота для небольших магазинов | Трудоемко, не автоматично |