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

Что значит «неактивный вариант» в WooCommerce и зачем его удалять?

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

Удаление таких вариантов помогает:

  • Оптимизировать базу данных и ускорить работу сайта;
  • Избежать ошибок и конфликтов при обработке заказов;
  • Поддерживать актуальность каталога товаров.

Диагностика: как определить, что у вас есть неактивные варианты?

Для диагностики используйте SQL-запрос или WP CLI:

SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status != 'publish';

В этом запросе выбираются все вариации с статусом, отличным от publish. Обычно неактивные варианты имеют статус draft, private или trash.

Также можно проверить наличие вариаций с нулевым запасом или без цены, что тоже часто сигнализирует о неактивных вариантах.

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

1. Создайте резервную копию базы данных

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

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

function wc_delete_inactive_variations() {
    // Получаем все вариации со статусом draft, private или trash
    $args = array(
        'post_type'      => 'product_variation',
        'post_status'    => array('draft', 'private', 'trash'),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );
    $variations = get_posts($args);
    if (empty($variations)) {
        return;
    }
    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // жесткое удаление
    }
}

// Запустите функцию вручную один раз (например, через admin_init)
add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_inactive_variations'])) {
        wc_delete_inactive_variations();
        wp_redirect(admin_url('edit.php?post_type=product&deleted=1'));
        exit;
    }
});

3. Выполните удаление

Перейдите в админ-панель WordPress по адресу https://ваш-сайт/wp-admin/edit.php?post_type=product&delete_inactive_variations=1. Скрипт удалит неактивные варианты и перенаправит обратно с параметром deleted=1.

4. Добавьте уведомление об успешном удалении (по желанию)

add_action('admin_notices', function() {
    if (isset($_GET['deleted']) && $_GET['deleted'] == 1) {
        echo '<div class="notice notice-success is-dismissible">Неактивные варианты товаров успешно удалены.</div>';
    }
});

Проверка результата

  • Снова выполните SQL-запрос из раздела диагностики — там не должно быть записей с неактивным статусом.
  • Проверьте список вариаций в админке товара — неактивные варианты исчезли.
  • Проверьте работу фронтенда и оформление заказа, чтобы убедиться, что активные варианты остались без изменений.

Частые ошибки и их устранение

1. Удаление не происходит

  • Проверьте, что у пользователя есть права manage_woocommerce.
  • Убедитесь, что в URL присутствует параметр delete_inactive_variations=1.
  • Проверьте ошибки PHP в логах — возможно, проблема с правами или синтаксисом.

2. Удаляются активные варианты

  • Проверьте, что фильтр по статусу вариаций корректен и не включает publish.
  • Убедитесь, что другие плагины не вмешиваются в статусы вариаций.

3. После удаления появляются ошибки на сайте

  • Проверьте, не используются ли удалённые варианты в старых заказах или кэшах.
  • Прочистите кэш сайта и браузера.

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

  • Не запускайте массовое удаление на живом сайте без резервного копирования.
  • Для больших магазинов с тысячами вариаций разбивайте удаление на порции, чтобы избежать таймаутов.
  • Используйте WP CLI для массовых операций, если есть доступ к консоли сервера, например:
wp post delete $(wp post list --post_type=product_variation --post_status=draft,private,trash --format=ids) --force
  • Регулярно проводите аудит статусов товаров и вариаций, чтобы не накапливать неактивные записи.
  • Для автоматизации можно создать WP Cron задачу, которая раз в неделю запускает функцию удаления.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПростота, нет кодаМного времени на большие каталогиМаленькие магазины
Код в functions.php (описанный выше)Автоматизация, быстроТребует базовых навыков PHPСредние и большие магазины
WP CLIСамый быстрый, без нагрузки на сайтТребуется доступ к серверу и консолиКрупные магазины, опытные администраторы
⭐⭐⭐⭐⭐