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

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

В интернет-магазинах на WooCommerce часто накапливаются товары, у которых закончился запас (stock = 0). Это может запутать менеджеров, ухудшить навигацию для клиентов и замедлить работу сайта, особенно если таких товаров много. Встроенного механизма автоматического удаления таких товаров WooCommerce не предоставляет. Задача — реализовать автоматическое удаление товаров с нулевым остатком, используя собственный код, без установки дополнительных плагинов.

Пошаговое решение: реализация автоматического удаления товаров с нулевым остатком

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

Функция должна искать все товары, у которых количество на складе равно нулю, и удалять их программно.

function wpdir_delete_zero_stock_products() {
    // Параметры запроса по товарам с нулевым остатком
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '='
            ),
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '='
            )
        ),
        'fields' => 'ids',
        'post_status' => 'publish'
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true - удаление без возможности восстановления
        }
    }
}

2. Запускаем функцию через WP-Cron для автоматизации

Чтобы не запускать функцию вручную, подключаем её к WP-Cron. Например, раз в сутки.

if (!wp_next_scheduled('wpdir_daily_delete_zero_stock')) {
    wp_schedule_event(time(), 'daily', 'wpdir_daily_delete_zero_stock');
}

add_action('wpdir_daily_delete_zero_stock', 'wpdir_delete_zero_stock_products');

3. Добавляем возможность ручного запуска в админке (опционально)

Это удобно для тестирования и экстренного удаления.

add_action('admin_menu', function() {
    add_submenu_page('tools.php', 'Удалить товары с 0 остатком', 'Удалить 0 остаток', 'manage_options', 'delete-zero-stock', function() {
        if (isset($_POST['delete_zero_stock'])) {
            wpdir_delete_zero_stock_products();
            echo '<div class="notice notice-success is-dismissible">Товары с нулевым остатком удалены.</div>';
        }
        echo '<form method="post"><input type="submit" name="delete_zero_stock" value="Удалить товары с 0 остатком" class="button button-primary" /></form>';
    });
});

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

  • Проверьте, что товары с остатком 0 действительно удалены после запуска функции (через WP-Cron или вручную).
  • Откройте раздел «Продукты» в админке WooCommerce и убедитесь, что таких товаров нет.
  • Просмотрите логи ошибок и убедитесь, что не возникло фатальных ошибок при удалении.

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

  • Товары не удаляются: проверьте, правильно ли срабатывает WP-Cron, и что функция подключена к хуку.
  • Удаляются не все товары с нулевым остатком: убедитесь, что в базе у товаров корректно установлен мета-ключ _stock и _stock_status. Иногда остаток может быть null или отсутствовать.
  • Удаление товаров вызывает сбои: возможно, есть зависимости — заказы, связанные с товарами. Удаляйте только товары, которые не используются в заказах или настройте обработку ошибок.

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

  • Перед удалением товаров сделайте резервную копию базы данных.
  • Для больших магазинов с тысячами товаров делайте удаление партиями — по 50-100 товаров за один запуск, чтобы не перегружать сервер.
  • Логируйте результаты работы функции в отдельный файл или в системный лог, чтобы отслеживать, когда и сколько товаров было удалено.
  • Если магазин использует кэширование, очистите кэш после удаления товаров, чтобы изменения отобразились на сайте.

Таблица сравнения способов удаления товаров с нулевым остатком

МетодПлюсыМинусы
Ручное удаление в админкеПростота, не требует кодаТрудоемко, риск пропуска товаров
Плагины авточистки (например, WP Bulk Delete)Удобство, графический интерфейсДополнительная нагрузка, возможность конфликтов
Собственный код + WP-CronГибкость, отсутствие плагинов, контроль процессаТребует навыков программирования, настройка
WooCommerce: автоматическое удаление неактивных товаров по дате последнего изменения
02.05.2026
Как добавить свой shortcode в WordPress
03.11.2025
Как создать собственный виджет для WordPress с примерами кода
21.11.2025
Как создать удобную настройку для плагина WordPress в админке с примерами кода
03.01.2026
Как настроить выработку изображений в WordPress для улучшения производительности
10.01.2026