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

Диагностика проблемы с нулевым остатком в WooCommerce

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

Чтобы решить эту проблему, нужно понять, как WooCommerce управляет запасами для товаров и их вариантов, и как реализовать автоматическое удаление или скрытие таких позиций.

Как проверить наличие проблемы?

  • Откройте каталог товаров и проверьте наличие товаров с остатком 0.
  • Попробуйте добавить такой товар или вариант в корзину — если система разрешает, значит, настройка управления запасами не корректна.
  • Проверьте в админке WooCommerce в разделе Товары > Запасы, включена ли опция Включить управление запасами.

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

1. Автоматическое удаление товаров с нулевым остатком

Добавим код, который будет запускаться по крону (WP-Cron) и удалять товары с остатком 0:

function wc_delete_out_of_stock_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );

    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_delete_post($product_id, true); // true - для безвозвратного удаления
        }
    }
}

// Запускаем функцию раз в день
if (!wp_next_scheduled('wc_delete_out_of_stock_products_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_products_hook');
}
add_action('wc_delete_out_of_stock_products_hook', 'wc_delete_out_of_stock_products');

Этот код удалит все товары, у которых статус запаса outofstock.

2. Автоматическое удаление вариантов (вариаций) с нулевым остатком

В WooCommerce вариации — это отдельный тип постов product_variation. Аналогично удалим вариации с нулевым остатком:

function wc_delete_out_of_stock_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );

    $variations = get_posts($args);

    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true);
        }
    }
}

if (!wp_next_scheduled('wc_delete_out_of_stock_variations_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_variations_hook');
}
add_action('wc_delete_out_of_stock_variations_hook', 'wc_delete_out_of_stock_variations');

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

  • Зайдите в админку WooCommerce > Товары и убедитесь, что товары и вариации с нулевым остатком удалены.
  • Проверьте каталог на сайте — отсутствуют товары с отметкой "Нет в наличии".
  • Для теста можете вручную установить остаток товара в 0 и дождаться выполнения WP-Cron (либо запустить вручную).
  • Для ручного запуска WP-Cron используйте плагин WP Crontrol или вызов функции через WP-CLI: wp cron event run wc_delete_out_of_stock_products_hook.

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

  • Крон не срабатывает: WP-Cron зависит от посещений сайта, если трафика мало — запланированные задачи не выполняются. Решение — настроить системный cron на сервере для вызова wp-cron.php.
  • Удаляются не те товары: проверьте правильность условий в meta_query, убедитесь, что значение _stock_status действительно "outofstock".
  • Удаление безвозвратно: используйте wp_trash_post() вместо wp_delete_post(), если хотите сначала переместить товар в корзину.
  • Удаление нарушает связи с заказами: удаляйте только товары, которые не были заказаны, или архивируйте для сохранения истории.

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

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

Сравнение вариантов решения

МетодПлюсыМинусы
Удаление через WP-Cron (код)Автоматизация, контроль, не требует плагиновЗависит от Cron, требует тестирования
Ручное удаление в админкеПростота, нет риска ошибок в кодеРучной труд, забывчивость, ошибка человека
Плагины для очистки запасовГотовое решение, часто с настройкамиЗависимость от сторонних разработчиков, нагрузка
Скрытие товаров вместо удаленияСохраняет историю, безопасноТовар все еще занимает место в базе
Как добавить автоматическое удаление отсутствующих вложений в Telegram каналах WordPress
22.01.2026
Добавление поля телефона с подтверждением в форму регистрации WordPress
12.02.2026
Оптимизация загрузки шрифтов в WordPress: практические решения и примеры кода
05.12.2025
Автоматическое удаление спама в комментариях WordPress
15.12.2025
Автоматическое удаление старых записей в WordPress через Cron
07.03.2026