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

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

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

Как определить неиспользуемые вариации

Обычно неиспользуемые вариации — это:

  • вариации без существующего родительского товара;
  • вариации, отключённые или скрытые, которые не продаются и не отображаются;
  • вариации с нулевой остаточной доступностью и без возможности заказа.

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

SELECT p.ID FROM wp_posts p LEFT JOIN wp_posts parent ON p.post_parent = parent.ID WHERE p.post_type = 'product_variation' AND (parent.ID IS NULL OR parent.post_status != 'publish');

Если таких записей много — пора чистить.

Пошаговое решение: удаление неиспользуемых вариаций через код

1. Создаём WP-CLI команду для безопасного удаления

WP-CLI позволяет выполнять команды из терминала. Создадим кастомную команду, которая удалит вариации без родителей и скрытые вариации с нулевой доступностью.

if ( defined('WP_CLI') && WP_CLI ) {
    WP_CLI::add_command('wc-clean-unused-variations', function() {
        global $wpdb;

        // Получаем вариации без родителя
        $orphans = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID WHERE p.post_type = 'product_variation' AND (parent.ID IS NULL OR parent.post_status != 'publish')");

        // Удаляем вариации без родителей
        foreach ($orphans as $variation_id) {
            wp_delete_post($variation_id, true);
        }

        // Получаем вариации с нулевым запасом и скрытые
        $hidden_variations = $wpdb->get_col(
            "SELECT p.ID FROM {$wpdb->posts} p 
             JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock'
             JOIN {$wpdb->postmeta} pm2 ON p.ID = pm2.post_id AND pm2.meta_key = '_stock_status'
             WHERE p.post_type = 'product_variation' AND 
             (p.post_status = 'private' OR pm2.meta_value = 'outofstock') AND 
             pm1.meta_value = '0'"
        );

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

        WP_CLI::success('Удалены неиспользуемые вариации продуктов: ' . count($orphans) . ' без родителей, ' . count($hidden_variations) . ' скрытых с нулевым запасом.');
    });
}

2. Запуск команды

Подключитесь к серверу по SSH, перейдите в папку сайта и выполните:

wp wc-clean-unused-variations

Команда удалит найденные вариации и выведет количество удалённых.

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

  • В админке WooCommerce проверьте раздел «Вариации» у продуктов — не должно быть мёртвых записей.
  • Запустите повторно SQL-запрос из диагностики — он должен вернуть пустой результат.
  • Проверьте размер таблиц wp_posts, wp_postmeta — уменьшение данных будет заметно при большом количестве удалённых вариаций.

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

  • Ошибка: WP-CLI команда не найдена
    Причина: WP-CLI не установлен или не подключена команда.
    Решение: Установите WP-CLI и убедитесь, что файл с командой загружается (например, в functions.php или через mu-плагин).
  • Ошибка: Некоторые вариации не удаляются
    Причина: Вариации имеют зависимости или кэш.
    Решение: Очистите кэш сайта и проверьте, нет ли сторонних плагинов, блокирующих удаление.
  • Ошибка: SQL-запрос возвращает ошибки
    Причина: Неправильный префикс таблиц.
    Решение: Используйте глобальную переменную $wpdb->posts вместо хардкода wp_posts.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Выполняйте удаление на тестовом сервере, чтобы исключить удаление нужных данных.
  • Оптимизируйте таблицы после удаления, выполнив OPTIMIZE TABLE wp_posts, wp_postmeta; через phpMyAdmin или командную строку.
  • Для крупных магазинов запускайте очистку в ночное время, чтобы не нагружать сервер при пиковых посещениях.
  • Если не хотите писать код — можно использовать плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=premiumwp.ru&utm_medium=article&utm_campaign=woocommerce-kak-udalit-neispolzuemye-variacii-produktov), который содержит функции очистки базы.

Сравнение вариантов удаления неиспользуемых вариаций

МетодПлюсыМинусыКогда использовать
Ручное удаление в админке Просто, не требует кода Долго при большом количестве вариаций, риск пропуска Маленькие магазины с редкими изменениями
WP-CLI скрипт (код) Автоматизация, быстро, гибко настраивается Требует доступа к серверу и навыков Средние и крупные магазины, регулярная очистка
Плагины (Clearfy Pro и др.) Простота, дополнительные функции оптимизации Потенциально лишние функции, стоимость Если нужна комплексная очистка и SEO-оптимизация
Оптимальное использование хуков и фильтров в WordPress: практические примеры и советы
13.12.2025
Как создать эффективный кеш в WordPress для ускорения сайта
28.11.2025
WooCommerce: как удалить неиспользуемые вариации продуктов через код
04.06.2026
Оптимизация загрузки пользовательских файлов в WordPress
07.02.2026
Как решить проблему конфликта JavaScript в WordPress
13.01.2026