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

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

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

Как понять, что в магазине есть товары с нулевым остатком

  • Перейдите в раздел Товары > Все товары в панели управления WooCommerce.
  • Используйте фильтр по запасам, чтобы отобразить товары с 0 запасов.
  • Для проверки через базу данных выполните SQL-запрос (через phpMyAdmin или консоль):
SELECT ID, post_title FROM wp_posts AS p
JOIN wp_postmeta AS pm ON p.ID = pm.post_id
WHERE pm.meta_key = '_stock' AND CAST(pm.meta_value AS SIGNED) = 0
AND p.post_type = 'product' AND p.post_status = 'publish';

Если таких товаров много, пора автоматизировать удаление.

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

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

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

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

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_delete_post(get_the_ID(), true); // true - безвозвратно удаляет
        }
        wp_reset_postdata();
    }
}

2. Запускаем функцию автоматически по расписанию

Чтобы регулярно удалять такие товары, подключим функцию к cron-задаче:

function wc_schedule_stock_cleanup() {
    if (!wp_next_scheduled('wc_daily_stock_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wc_daily_stock_cleanup');
    }
}
add_action('wp', 'wc_schedule_stock_cleanup');

add_action('wc_daily_stock_cleanup', 'wc_delete_out_of_stock_products');

3. Альтернативный вариант: запуск через WP-CLI

Если у вас есть доступ к консоли сервера с WP-CLI, можно создать команду для запуска удаления вручную или через системный cron:

wp eval '
$products = new WP_Query([
    "post_type" => "product",
    "post_status" => "publish",
    "meta_query" => [
        ["key" => "_stock", "value" => "0", "compare" => "=", "type" => "NUMERIC"],
        ["key" => "_stock_status", "value" => "outofstock", "compare" => "="]
    ],
    "posts_per_page" => -1
]);

foreach ($products->posts as $product) {
    wp_delete_post($product->ID, true);
}
'

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

  • После запуска cron или вручную вызовите функцию wc_delete_out_of_stock_products() и проверьте раздел «Товары» — товары с нулевым остатком должны исчезнуть.
  • Проверьте базу данных через SQL-запрос, приведенный выше — он не должен возвращать удаленные товары.
  • Проверьте логи сервера на предмет ошибок, чтобы убедиться, что функции не вызывают фатальных ошибок.

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

  • Ошибка: Товары не удаляются.
    Причина: Неправильные мета-ключи или значения в запросе.
    Решение: Убедитесь, что в базе именно такие мета-ключи _stock и _stock_status и что статус равен outofstock. В WooCommerce иногда статус может быть другим, проверьте это на примере товара.
  • Ошибка: Функция вызывает превышение времени выполнения.
    Причина: Слишком много товаров для обработки за один запуск.
    Решение: Разбейте обработку на части, например, используя параметр posts_per_page и обрабатывая порциями.
  • Ошибка: Функция удаляет товары с остатком.
    Причина: Некорректный фильтр мета-данных.
    Решение: Проверьте типы данных и сравнения в meta_query, используйте 'type' => 'NUMERIC' и точное сравнение.

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

  • Используйте wp_delete_post() с параметром $force_delete = true, чтобы удалить товар без помещения в корзину, высвобождая место в базе.
  • Если магазин очень большой, запускайте удаление в ночное время с минимальной нагрузкой.
  • Храните резервную копию базы перед автоматическим удалением, чтобы избежать потерь данных.
  • Для дополнительной безопасности можно добавить проверку текущего пользователя или IP перед запуском функции вручную.

Сравнение решений: плагин vs. код

РешениеПреимуществаНедостатки
Плагин (например, WooCommerce Out of Stock Manager)Простая установка и настройка;
Обновления и поддержка;
Графический интерфейс
Нагрузка на сайт;
Могут конфликтовать с другими плагинами;
Ограниченная гибкость
Код в functions.php + cronМаксимальный контроль;
Легковесность;
Гибкость под задачи магазина
Требует навыков разработки;
Необходимо тестировать и поддерживать самостоятельно

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: как настроить авторизацию пользователей через Telegram-бота с помощью webhook
28.04.2026
Как сделать автоматический отчет по аналитике в WordPress с помощью плагинов и кода
26.12.2025
WooCommerce: как автоматически менять статус заказа при оплате через платежные системы
18.04.2026
Как создать и использовать собственный Post Type в WordPress: подробное руководство
25.11.2025
Как удалить кэш AJAX-запросов в WordPress без плагинов
15.04.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее