WooCommerce: Автоматическое удаление вариантов товаров по условию через код

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

В WooCommerce часто возникает задача автоматически очистить каталог от ненужных вариаций товаров — например, тех, которые давно не продаются или имеют статус «нет в наличии» более определённого времени. В стандартном интерфейсе WooCommerce такой массовой операции нет, а ручное удаление занимает много времени и неэффективно. Для решения этой задачи нужно написать собственный скрипт, который проверяет условия и удаляет вариации программно.

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

  • Определить условие удаления: дата последней продажи, наличие на складе, мета-данные вариаций и т.п.
  • Проверить, что вариации действительно существуют и связаны с товарами-родителями.
  • Убедиться, что удаление не нарушит логику заказов и отчётов.
  • Провести резервное копирование базы данных перед массовыми изменениями.

Пошаговое решение: пример кода для удаления вариаций по условию отсутствия на складе

Рассмотрим пример автоматического удаления вариаций, у которых статус склада – «outofstock» более 30 дней (сохраняется дата последнего обновления meta _stock_status_changed — в реальных магазинах может потребоваться добавить этот мета-ключ самостоятельно):

function wpb_delete_old_outofstock_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'date_query' => [
            [
                'column'    => 'post_modified_gmt',
                'before'    => '30 days ago',
            ],
        ],
        'fields' => 'ids',
    ];

    $variations = get_posts($args);

    if(empty($variations)) {
        error_log('Нет вариаций для удаления.');
        return;
    }

    foreach($variations as $variation_id) {
        wp_delete_post($variation_id, true);
        error_log("Удалена вариация ID: $variation_id");
    }
}

// Запуск по крону или вручную
// add_action('wp_loaded', 'wpb_delete_old_outofstock_variations');

Код собирает ID вариаций с нужным статусом и датой изменения более 30 дней назад, затем удаляет их навсегда.

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

  • В админке WooCommerce зайдите в список продуктов, выберите нужный товар и убедитесь, что вариации с условием отсутствуют.
  • Проверьте записи в журнале ошибок (error_log) для подтверждения удаления.
  • Запустите скрипт несколько раз, чтобы убедиться, что повторно удалять нечего — значит, условие сработало корректно.
  • Проверьте отчёты WooCommerce на предмет корректного отображения остатков и продаж.

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

  • Ошибка: Вариации не удаляются.
    Причина: Неправильный meta_key или условие в запросе.
    Решение: Проверьте, что вариации действительно имеют мета с ключом _stock_status и нужное значение. Для диагностики используйте WP CLI или var_dump результатов get_posts().
  • Ошибка: Удаляются не те вариации.
    Причина: Слишком общий запрос.
    Решение: Добавьте дополнительные условия в meta_query или фильтры, например, проверку родительского товара, категорий и т.д.
  • Ошибка: Скрипт вызывает таймаут или превышает лимит памяти.
    Решение: Разбейте удаление на батчи, например, обрабатывайте по 50 вариаций за запуск с помощью параметра 'posts_per_page' => 50 и запускайте по Cron.

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

  • Перед массовым удалением сделайте полный бэкап базы — восстановление из резервной копии быстро решит ошибки.
  • Используйте wp_delete_post($id, true) с вторым параметром true для полного удаления из базы, а не только в корзину.
  • Для регулярного запуска используйте WP-Cron с ограничением времени выполнения, чтобы не перегружать сервер.
  • Если нужно часто проверять статус вариаций, рассмотрите кэширование результатов запроса через Transients API.

Сравнение подходов удаления вариантов товаров в WooCommerce

МетодПлюсыМинусыПример использования
Удаление вручную в админкеПросто, без кодаТрудозатратно при большом количестве вариацийРедактирование вариаций в консоли WooCommerce
Использование SQL-запросовБыстро и напрямуюРиск повредить данные, сложность в поддержкеDELETE FROM wp_posts WHERE post_type = 'product_variation' AND ...
Код на PHP с использованием WP APIКонтролируемо, масштабируемо, безопасноТребует знаний PHP и WPПример из статьи с wp_delete_post()
Плагины для очистки каталогаУдобно, интерфейсМожет не подходить под специфичные условияПлагины из репозитория
Как исправить ошибку «Не открывается корзина WooCommerce»: практическое руководство
30.06.2026
Как удалить автоматически создаваемые категории в WordPress
03.04.2026
Как устроить авторизацию по телефону в WordPress
06.02.2026
Как создать собственный REST API endpoint в WordPress
03.12.2025
Как избежать конфликтов между WooCommerce и плагинами: практическое руководство
17.06.2026