WooCommerce: автоматическое удаление неактивных вариантов и атрибутов

Проблема: накопление неактивных вариаций и атрибутов в WooCommerce

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

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

Чтобы понять, есть ли неактивные вариации и атрибуты, выполните следующие действия:

  • Перейдите в раздел Товары → Атрибуты и проверьте список доступных атрибутов.
  • Откройте каждый атрибут и просмотрите связанные термины — выявите те, которые не используются ни в одной вариации.
  • Используйте SQL-запросы для выявления вариаций, которые не связаны с активными товарами или имеют статус "черновик" / "отклонён".

Пример SQL-запроса для поиска неактивных вариаций:

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

Этот запрос покажет вариации, у которых родительский товар не опубликован или отсутствует.

Пошаговое решение: удаление неактивных вариантов и атрибутов

1. Создание функции для удаления неактивных вариаций

Добавьте следующий код в файл functions.php вашей дочерней темы или создайте отдельный плагин для кастомных функций:

function wc_delete_inactive_variations() {
    global $wpdb;
    // Получаем ID вариаций, у которых нет активного родителя
    $variation_ids = $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.post_status != 'publish' OR parent.ID IS NULL)"
    );
    if (empty($variation_ids)) {
        return 'Неактивных вариаций не найдено';
    }
    foreach ($variation_ids as $variation_id) {
        wp_delete_post($variation_id, true); // принудительное удаление
    }
    return 'Удалено ' . count($variation_ids) . ' неактивных вариаций';
}

2. Удаление неиспользуемых атрибутов и терминов

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

function wc_delete_unused_product_attributes() {
    global $wpdb;
    $deleted_terms = 0;
    // Получаем все атрибуты
    $attribute_taxonomies = wc_get_attribute_taxonomies();
    if (!$attribute_taxonomies) {
        return 'Атрибуты не найдены';
    }
    foreach ($attribute_taxonomies as $attribute) {
        $taxonomy = wc_attribute_taxonomy_name($attribute->attribute_name);
        // Получаем все термины таксономии
        $terms = get_terms(array(
            'taxonomy' => $taxonomy,
            'hide_empty' => false
        ));
        if (is_wp_error($terms)) {
            continue;
        }
        foreach ($terms as $term) {
            // Проверяем использование термина
            $count = $term->count;
            if ($count === 0) {
                wp_delete_term($term->term_id, $taxonomy);
                $deleted_terms++;
            }
        }
    }
    return 'Удалено неиспользуемых терминов: ' . $deleted_terms;
}

3. Интеграция с WP-Cron для регулярной очистки

Чтобы запускать очистку автоматически, добавьте хук и задачу WP-Cron:

add_action('wc_cleanup_inactive_variations_cron', function() {
    $message1 = wc_delete_inactive_variations();
    $message2 = wc_delete_unused_product_attributes();
    error_log($message1 . ' | ' . $message2);
});

// Регистрируем событие раз в сутки
if (!wp_next_scheduled('wc_cleanup_inactive_variations_cron')) {
    wp_schedule_event(time(), 'daily', 'wc_cleanup_inactive_variations_cron');
}

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

  • Запустите функции вручную, вызвав их через echo wc_delete_inactive_variations(); и echo wc_delete_unused_product_attributes(); в отдельном тестовом скрипте или через WP-CLI.
  • Проверьте, что неактивные вариации удалены — выполните SQL-запрос из раздела диагностики снова.
  • Просмотрите список атрибутов в админке — неиспользуемые термины должны исчезнуть.
  • После настройки WP-Cron проверьте логи ошибок (error_log), чтобы убедиться, что задачи выполняются.

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

  • Удаление не сработало: Проверьте, что у вас есть права на удаление постов и терминов. Иногда плагины безопасности блокируют удаление.
  • WP-Cron не запускается: Убедитесь, что ваш сервер поддерживает запуск WP-Cron — можно настроить системный CRON и отключить имитацию WP-Cron (DISABLE_WP_CRON в wp-config.php).
  • Удаляются нужные вариации: Перед удалением всегда делайте резервную копию базы. Проверьте логику выборки вариаций — возможно, товары в статусе "черновик" временно нужны.
  • Не удаляются термины атрибутов: Убедитесь, что термин действительно не использован — иногда связь может быть в кэшах или сторонних плагинах.

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

  • Резервное копирование: Перед массовым удалением сделайте бэкап базы данных.
  • Тестирование: Запускайте скрипты сначала в тестовой среде.
  • Оптимизация запросов: При большом каталоге разбивайте удаление на партии по 100-200 записей, чтобы избежать таймаутов.
  • Мониторинг: Настройте уведомления или логи выполнения WP-Cron задач.

Сравнение вариантов удаления неактивных вариаций и атрибутов

МетодПлюсыМинусыПодходит для
Ручное удаление в админкеПростой, не требует кодаТрудозатратно при большом каталогеМаленькие магазины
SQL-запросы напрямуюБыстро, можно массовоРиск ошибок, требует знаний SQLОпытные разработчики
Кастомные функции и WP-CronАвтоматизация, контрольНужно писать и тестировать кодСредние и крупные магазины
Плагины очистки каталога (например, Clearfy Pro)Удобство, дополнительные опцииПлатные решения, дополнительные зависимостиБыстрая настройка без кода
WooCommerce: Автоматическое удаление товаров с отсутствующими атрибутами и вариациями
13.05.2026
WooCommerce: автоматическое удаление заказов по неактивности и статусу
16.05.2026
WooCommerce: автоматическое изменение цены при низком остатке товара
27.06.2026
WooCommerce: автоматическое удаление неактивных вариантов и атрибутов
23.06.2026
Как добавить динамические параметры в URL в WordPress
30.03.2026