WooCommerce: как автоматически удалять товары без склада

Диагностика проблемы: зачем удалять товары без наличия на складе

В интернет-магазинах на WooCommerce часто возникают ситуации, когда товары с нулевым или отрицательным запасом остаются в каталоге, создавая путаницу для покупателей и снижая конверсию. Автоматическое удаление таких товаров позволяет поддерживать актуальность ассортимента без ручного контроля.

Как определить товары без склада в WooCommerce

WooCommerce хранит информацию о запасах в мета-полях продуктов. Основное поле — _stock, где хранится количество товара на складе. Товары с _stock равным 0 или меньше считаются отсутствующими.

Для диагностики можно выполнить следующий SQL-запрос по базе данных WordPress, чтобы получить список товаров без склада:

SELECT p.ID, p.post_title, pm.meta_value AS stock
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product'
AND pm.meta_key = '_stock'
AND CAST(pm.meta_value AS SIGNED) <= 0
AND p.post_status = 'publish';

Пошаговое решение: автоудаление товаров без остатка

1. Создаем функцию для удаления товаров без склада

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

function wc_delete_out_of_stock_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_trash_post(get_the_ID()); // отправляем в корзину
        }
        wp_reset_postdata();
    }
}

2. Запуск функции по расписанию WP-Cron

Для автоматизации запуска добавьте в functions.php следующее:

if (!wp_next_scheduled('wc_delete_out_of_stock_daily')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_daily');
}
add_action('wc_delete_out_of_stock_daily', 'wc_delete_out_of_stock_products');

Это настроит ежедневный запуск удаления товаров без склада.

3. Опционально: уведомление администратора

Чтобы получать уведомления после удаления, можно расширить функцию:

function wc_delete_out_of_stock_products() {
    $deleted = 0;
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_trash_post(get_the_ID());
            $deleted++;
        }
        wp_reset_postdata();
    }

    if ($deleted > 0) {
        wp_mail(get_option('admin_email'), 'Удаление товаров без склада', "Автоматически удалено товаров без наличия: $deleted");
    }
}

Проверка результата после внедрения

  • Проверьте наличие товаров с нулевым запасом в админке WooCommerce — они должны быть перемещены в корзину.
  • Запустите вручную функцию через WP-CLI (если есть доступ): wp eval 'wc_delete_out_of_stock_products();'
  • Просмотрите логи почты администратора для получения уведомлений.
  • Проверьте, что на фронтенде отсутствуют товары с нулевым запасом.

Частые ошибки и как их исправить

  • Товары не удаляются: проверьте, что WP-Cron работает. Используйте плагин WP Crontrol для диагностики и запуска планировщика вручную.
  • Удаляются нужные товары: убедитесь, что в мета-поле _stock нет ошибок и что вы правильно определяете условие удаления.
  • Нет уведомлений на почту: проверьте настройки SMTP, убедитесь, что wp_mail() работает корректно.

Практические советы по безопасности и производительности

  • Используйте wp_trash_post(), а не wp_delete_post(), чтобы можно было восстановить товары в случае ошибки.
  • Если у вас большой каталог, разделите обработку на партии, чтобы избежать превышения лимитов памяти и времени выполнения.
  • Проверяйте работу WP-Cron, особенно на хостингах с ограничениями.
  • Для дополнительной безопасности сделайте резервное копирование базы данных перед внедрением.

Сравнение методов удаления товаров без склада

МетодПлюсыМинусыКомпромисс
Ручное удаление в админкеПростой, не требует кодаТрудоемко на больших каталогахПодходит для малых магазинов
Плагин для автоматического удаленияАвтоматизация, удобный интерфейсДополнительная нагрузка, может конфликтоватьВыбирайте проверенные плагины
Кодовое решение с WP-CronЛегковесно, контролируемо, гибкоТребует навыков разработки, настройка расписанияЛучший вариант для разработчиков
Как добавить владельца (автора) постов в WordPress и управлять им программно
20.02.2026
WooCommerce: автоматическое изменение статуса заказа при отключении метода оплаты
30.06.2026
WordPress: как создать и использовать собственные таксономии
18.01.2026
Удаление неиспользуемых изображений в WordPress для оптимизации сайта
20.12.2025
WooCommerce: как автоматически удалять товары без склада
26.05.2026