WooCommerce: как удалить старые вариации товаров с помощью кода

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

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

Если вы замечаете, что в базе много вариаций, которые не отображаются в каталоге, либо хотите автоматизировать регулярное удаление старых вариаций (например, по дате создания или по определённым мета-данным), нужно использовать кастомный PHP-код.

Пошаговое решение: удаляем вариации через WP-CLI и код в functions.php

1. Определяем критерии удаления

Например, удалим все вариации товара, созданные более 180 дней назад:

$days_threshold = 180; // дней
$timestamp_threshold = strtotime("-{$days_threshold} days");

2. Запрос вариаций для удаления

Используем WP_Query для выборки вариаций с нужным условием:

$args = [
    'post_type'      => 'product_variation',
    'posts_per_page' => -1,
    'date_query'     => [
        [
            'before'    => date('Y-m-d H:i:s', $timestamp_threshold),
            'inclusive' => true,
        ],
    ],
    'fields'         => 'ids',
    'post_status'    => 'publish',
];
$query = new WP_Query($args);
$variation_ids = $query->posts;

3. Удаление вариаций через wp_delete_post

Удаляем вариации с принудительным удалением из базы:

foreach ($variation_ids as $variation_id) {
    wp_delete_post($variation_id, true);
}

4. Интеграция кода в functions.php или отдельный плагин

Оборачиваем логику в функцию и вызываем по хуку, например, при админской загрузке или через WP-CLI команду.

function delete_old_product_variations() {
    $days_threshold = 180;
    $timestamp_threshold = strtotime("-{$days_threshold} days");

    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'date_query'     => [
            [
                'before'    => date('Y-m-d H:i:s', $timestamp_threshold),
                'inclusive' => true,
            ],
        ],
        'fields'         => 'ids',
        'post_status'    => 'publish',
    ];

    $query = new WP_Query($args);
    if (empty($query->posts)) {
        return;
    }

    foreach ($query->posts as $variation_id) {
        wp_delete_post($variation_id, true);
    }
}

add_action('admin_init', 'delete_old_product_variations');

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

  • Перейдите в раздел «Товары» — «Вариации» в админке WooCommerce и убедитесь, что старые вариации исчезли.
  • Проверьте размер таблицы wp_posts с типом product_variation в базе данных — количество должно уменьшиться.
  • Выполните в базе запрос на подсчёт вариаций, созданных более 180 дней назад:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY);

Результат должен быть 0.

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

  • Ошибка: Вариации не удаляются, хотя код выполняется.
    Причина: Вариации имеют статус, отличный от publish. Решение — добавить 'post_status' => ['publish', 'private', 'draft'] в аргументы WP_Query.
  • Ошибка: Удаление происходит не полностью, остаются мета-данные.
    Причина: Используется wp_delete_post с вторым параметром false (корзина). Решение — обязательно поставить true для полного удаления.
  • Ошибка: Ресурсоёмкая операция приводит к таймауту.
    Решение: Делайте удаление частями, например, по 50 вариаций за раз с помощью пагинации WP_Query и повторного вызова функции.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением.
  • Запускайте удаление вручную либо через WP-CLI, чтобы избежать нагрузки на сайт при посещениях пользователей.
  • Для регулярного удаления используйте WP-Cron с ограничением количества удаляемых вариаций за запуск.
  • Добавляйте проверку прав пользователя при вызове функции (например, current_user_can('manage_woocommerce')), чтобы предотвратить случайный запуск неавторизованным.

Сравнение способов удаления вариаций WooCommerce

МетодПлюсыМинусыКомпромисс
Ручное удаление через админкуПросто, без кодаДолго, неудобно при большом количествеИспользовать только для единичных случаев
Использование плагиновИнтерфейс, дополнительные функцииМогут грузить сайт, не всегда гибкоХорошо для непрофессионалов, но проверять нагрузку
Код на PHP + WP-CLIПолный контроль, быстрая обработкаТребует навыков, риск ошибкиРекомендуется для опытных разработчиков с бэкапами
Как настроить автоматическое создание резервных копий в WordPress
20.12.2025
Как создать автоматический сбор отзывов в WordPress
24.01.2026
Как автоматически удалять старые комментарии с блокировкой в WordPress
24.02.2026
Как удалить старые мета-данные в WordPress: практическое руководство
12.03.2026
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
30.05.2026