Диагностика проблемы отсутствия автоматического удаления товаров с нулевым остатком
Во многих магазинах на WooCommerce при исчерпании запасов товаров они остаются видимыми в каталоге. Это может вводить покупателей в заблуждение и ухудшать пользовательский опыт. Автоматическое удаление таких товаров помогает поддерживать актуальность ассортимента без необходимости ручного контроля.
Проверьте, что в настройках WooCommerce не активирована опция скрытия товаров без наличия. По умолчанию WooCommerce только скрывает товары без остатков, но не удаляет их.
Как проверить статус товара и поведение WooCommerce при нулевом остатке
- Перейдите в админку WooCommerce → Товары → выберите товар с нулевым остатком;
- Проверьте вкладку «Инвентарь» — установлен ли флаг «Управлять запасами» и есть ли остаток 0;
- Посмотрите на фронтенде, отображается ли товар в каталоге;
- Если товары видны, значит автоматическое удаление или скрытие не настроено.
Пошаговое решение: Автоматическое удаление товаров с нулевым остатком через код
Для автоматизации задачи можно использовать крон-задачу WordPress, которая будет регулярно проверять товары и удалять те, у которых остаток равен нулю. Ниже пример кода, который нужно добавить в файл functions.php вашей темы или в собственный плагин.
function wp_remove_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
],
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
wp_trash_post($product_id); // перемещаем в корзину
}
}
add_action('wp_scheduled_remove_out_of_stock', 'wp_remove_out_of_stock_products');
// Планируем задачу, если ещё не запланирована
if (!wp_next_scheduled('wp_scheduled_remove_out_of_stock')) {
wp_schedule_event(time(), 'daily', 'wp_scheduled_remove_out_of_stock');
}Объяснение кода:
- Используем
get_postsдля выборки всех товаров со статусомoutofstock(WooCommerce автоматически меняет этот мета-ключ при исчерпании запасов); - Удаляем товары с помощью
wp_trash_post, что безопаснее полного удаления, так как можно восстановить из корзины; - Запускаем эту функцию ежедневно через wp-cron.
Дополнительная настройка: удаление товаров без запаса на основе точного количества
Если вы хотите удалять товары с запасом ровно 0, а не только со статусом outofstock, используйте такой запрос:
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => 0,
'compare' => '=',
'type' => 'NUMERIC'
],
],
'fields' => 'ids',
];Проверка результата после внедрения
- Запустите задачу вручную через
do_action('wp_scheduled_remove_out_of_stock');в консоли или временно вызовите функцию напрямую; - Проверьте, что товары с нулевым остатком перемещены в корзину (раздел «Корзина» в админке товаров);
- Обновите фронтенд — товары должны исчезнуть из каталога;
- Просмотрите логи ошибок сервера и debug.log на наличие проблем.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, что задача wp-cron работает. Иногда на хостингах cron отключён, тогда нужно настроить системный cron для вызова
wp-cron.php; - Удаляются не все товары: проверьте правильность мета-запроса. Статус
outofstockобновляется только если включено управление запасами; - Удаление происходит слишком часто: убедитесь, что событие планируется один раз в сутки — дублирование задач приведёт к нагрузке;
- Ошибка прав доступа: функция
wp_trash_postтребует прав администратора, удостоверьтесь, что код выполняется с необходимыми правами.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами товаров разбивайте удаление на пачки по 50-100 штук, чтобы избежать превышения лимита времени выполнения:
function wp_remove_out_of_stock_products_batch() {
$args = [
'post_type' => 'product',
'posts_per_page' => 50,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
],
'fields' => 'ids',
];
$products = get_posts($args);
if (empty($products)) {
// Остановить задачу, если товаров больше нет
wp_clear_scheduled_hook('wp_scheduled_remove_out_of_stock');
return;
}
foreach ($products as $product_id) {
wp_trash_post($product_id);
}
}
add_action('wp_scheduled_remove_out_of_stock', 'wp_remove_out_of_stock_products_batch');- Регулярно проверяйте раздел «Корзина» и очищайте её, чтобы не накапливать удалённые товары;
- Настройте резервное копирование перед автоматическим удалением;
- Если используете кеширование, убедитесь, что оно сбрасывается после удаления товаров, чтобы они исчезали с фронтенда мгновенно.
Таблица сравнения способов удаления товаров с нулевым остатком
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин (например, WP Shop Clearfy) | Простая настройка, поддержка | Зависимость от стороннего кода, нагрузка | Удобно, если не умеете писать код |
| Код с wp-cron (как в статье) | Гибкость, без сторонних зависимостей | Требует навыков, может нагружать сервер | Оптимизировать под размер магазина |
| Ручное удаление | Полный контроль | Трудозатратно, риск забыть | Подходит для маленьких магазинов |