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

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

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

Как проверить количество вариантов и их состояние в базе

Вариации товаров в WooCommerce хранятся как записи типа product_variation в таблице wp_posts. Основной товар — это родительская запись, а вариации — дочерние.

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';

Чтобы найти варианты, которые не связаны с активными товарами или не имеют заказов, можно использовать более сложные запросы, но сначала рекомендуем выгрузить список по ID товаров.

Пошаговое решение: удаление старых вариантов товаров через PHP

Для безопасного удаления вариантов без плагинов можно использовать PHP-скрипт, который:

  • Ищет варианты старше заданного срока
  • Проверяет, что варианты не связаны с активными заказами
  • Удаляет варианты через функцию WooCommerce, чтобы очистить все метаданные

Пример кода для удаления вариантов старше 180 дней, не участвующих в заказах

function delete_old_unused_variations() {
    global $wpdb;
    // Получаем варианты старше 180 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
    $variations = $wpdb->get_results($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_date < %s",
        $date_threshold
    ));

    foreach ($variations as $variation) {
        $variation_id = $variation->ID;

        // Проверяем, есть ли заказы с этим вариантом
        $order_items = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_itemmeta iom
             JOIN {$wpdb->prefix}woocommerce_order_items oi ON iom.order_item_id = oi.order_item_id
             WHERE iom.meta_key = '_variation_id' AND iom.meta_value = %d",
            $variation_id
        ));

        if (!$order_items) {
            // Безопасное удаление варианта
            wp_delete_post($variation_id, true);
        }
    }
}

// Запускаем один раз или через cron
add_action('init', 'delete_old_unused_variations');

Запускать этот код рекомендуется один раз, например, временно добавив в файл functions.php темы или в отдельный плагин, затем удалить, чтобы не нагружать сайт.

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

  • Выполните повторный запрос в базу: SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';, чтобы убедиться, что количество вариантов уменьшилось.
  • Проверьте в админке WooCommerce: откройте товары с вариантами - старые варианты должны исчезнуть.
  • Убедитесь, что на сайте нет ошибок при отображении товаров с вариациями.

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

  • Удаление вариантов, связанных с заказами. Это может привести к ошибкам в истории заказов. Проверяйте связанные заказы по мета-ключу _variation_id.
  • Потеря данных из-за неправильного удаления. Используйте wp_delete_post() с параметром true, чтобы удалить все связанные метаданные.
  • Скрипт не запускается. Убедитесь, что код добавлен в правильное место и выполняется. Для теста можно добавить error_log() внутри цикла.

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

  • Перед запуском скрипта обязательно сделайте бэкап базы данных.
  • Для больших магазинов запускайте удаление пакетами по 50-100 вариантов, чтобы избежать таймаутов PHP.
  • Можно использовать WP-Cron для автоматизации очистки, но лучше запускать вручную или через системный cron для надежности.
  • Оптимизируйте таблицы базы данных после удаления: OPTIMIZE TABLE wp_posts;

Сравнение вариантов удаления старых вариантов товаров

МетодПлюсыМинусыРекомендации
Удаление через PHP скрипт (как в статье)Полный контроль, без плагинов, можно автоматизироватьТребует навыков, риски при ошибкахИспользовать с бэкапом, тестировать на стейджинге
Удаление через плагины (например, WP Bulk Delete)Упрощает процесс, интерфейсДополнительная нагрузка, возможны конфликтыПодходит для новичков, проверять плагины на совместимость
Удаление вручную через админку WooCommerceПолный контроль на уровне интерфейсаОчень долго для большого количества, риск пропускаПодходит для единичных вариантов
Как решить проблему задержки загрузки изображений в WooCommerce
12.06.2026
Как добавить поддержку виджетов Gutenberg в собственную тему WordPress
08.01.2026
Автоматическое удаление завершённых заказов WooCommerce через PHP
05.06.2026
Как решить проблему: не работает форма обратной связи в WordPress
07.12.2025
Как создать фильтры для товаров в WooCommerce без плагинов
19.01.2026