WooCommerce: автоматическое удаление товаров и вариаций без остатков

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

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

  • Ручное отключение или удаление товаров не производится;
  • Отсутствие автоматизации для очистки неактивных позиций;
  • Вариации товаров не удаляются автоматически при обнулении запасов;
  • Использование сторонних плагинов, которые не синхронизируют статусы товаров с остатками.

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

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

В WooCommerce вариации хранятся как дочерние записи типа product_variation. Для их удаления необходимо проверить запасы и статус управления запасами.

function wpset_delete_variations_out_of_stock() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => ['publish', 'private'],
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);

    foreach ($variations as $variation_id) {
        $variation = wc_get_product($variation_id);
        if (!$variation) continue;

        // Проверяем управление запасами и количество
        if ($variation->managing_stock() && $variation->get_stock_quantity() <= 0) {
            wp_delete_post($variation_id, true); // Полное удаление
        }
    }
}

2. Удаляем товары без запасов и без вариаций

Для простых товаров без вариаций проверяем запасы и удаляем товар при 0 запасов.

function wpset_delete_simple_products_out_of_stock() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => ['publish', 'private'],
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ],
        ],
        'tax_query' => [
            [
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => ['simple'],
            ],
        ],
        'fields' => 'ids',
    ];

    $products = get_posts($args);

    foreach ($products as $product_id) {
        wp_delete_post($product_id, true);
    }
}

3. Объединяем функции и запускаем по расписанию

Чтобы автоматизировать процесс, создадим хук, который будет запускаться ежедневно с помощью WP-Cron.

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

add_action('wpset_daily_delete_out_of_stock', function() {
    wpset_delete_variations_out_of_stock();
    wpset_delete_simple_products_out_of_stock();
});

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

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

  • Проверьте наличие вариаций с 0 запасов в админке WooCommerce — они должны исчезать после запуска скрипта;
  • Аналогично — простые товары с запасами 0 должны автоматически удаляться;
  • Для тестирования можно вручную вызвать функции через do_action('wpset_daily_delete_out_of_stock'); в файле functions.php или через WP CLI;
  • Проверьте журнал ошибок сервера для выявления возможных проблем при удалении;
  • Убедитесь, что товары с запасом больше 0 не удаляются.

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

  • Удаление не происходит: проверьте, что WP-Cron работает корректно, нет отключенных задач;
  • Удаляются товары с остатками: проверьте логику условий в коде, убедитесь, что managing_stock() и get_stock_quantity() работают верно;
  • Удаление приводит к ошибкам: убедитесь, что функции вызываются в правильном контексте, нет конфликтов с плагинами;
  • Проблемы с производительностью при большом количестве товаров: реализуйте обработку партиями (batch processing) с помощью offset и limit в запросах.

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

  • Используйте wp_delete_post($id, true) с осторожностью — без возможности восстановления;
  • Перед внедрением сделайте полную резервную копию базы данных;
  • Для больших магазинов рекомендуем запускать удаление в ночное время, чтобы не нагружать сервер;
  • Используйте транзиенты или кеширование, чтобы минимизировать количество запросов при проверке запасов;
  • Проверяйте совместимость с используемыми плагинами для управления запасами и вариациями.

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

МетодПреимуществаНедостаткиПример
Ручное удаление через админку Простота, контроль Трудоемко, риск пропуска Админка WooCommerce
Плагин для очистки запасов Автоматизация, удобство Зависимость от плагина, нагрузка WooCommerce Stock Manager
Собственный код с WP-Cron (предложенный способ) Гибкость, контроль, отсутствие доп. плагинов Требует навыков, возможна ошибка в коде Код из статьи
Как удалить неиспользуемые метаполя в WordPress с помощью кода
30.03.2026
Автоматическое изменение веса продукта в WooCommerce при обновлении атрибутов
21.05.2026
Автоматический импорт товаров из YML в WordPress: пошаговое руководство
05.02.2026
Как использовать WooCommerce хуки для автоматизации обработки заказов
27.04.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров
11.07.2026