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

Почему нужно удалять неактивные вариации товаров в WooCommerce

На больших WooCommerce-магазинах с вариативными товарами часто накапливается множество вариаций, которые больше не используются или неактивны. Они замусоривают базу данных, замедляют загрузку страниц и усложняют администрирование. Удаление таких вариаций вручную занимает много времени и неэффективно.

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

Диагностика: как определить неактивные вариации товаров

В WooCommerce вариации — это дочерние записи типа product_variation с метаполем _stock_status. Вариация считается неактивной, если:

  • статус товара — draft, pending или trash;
  • наличие _stock_status равно outofstock и товар давно не покупался;
  • время последнего изменения вариации превышает определённый порог (например, 180 дней).

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

SELECT p.ID, p.post_title, p.post_status, pm.meta_value AS stock_status, p.post_modified FROM wp_posts p INNER JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND pm.meta_key = '_stock_status' AND (p.post_status IN ('draft', 'pending', 'trash') OR pm.meta_value = 'outofstock') ORDER BY p.post_modified ASC LIMIT 100;

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

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

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

Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

function wc_delete_inactive_variations() {
    global $wpdb;
    $days = 180; // Порог в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID вариаций, которые неактивны и старше порога
    $variation_ids = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT p.ID FROM {$wpdb->posts} p
            INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product_variation'
            AND pm.meta_key = '_stock_status'
            AND (p.post_status IN ('draft', 'pending', 'trash') OR pm.meta_value = 'outofstock')
            AND p.post_modified < %s",
            $date_threshold
        )
    );

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $variation_id) {
            wp_delete_post($variation_id, true); // принудительное удаление без перемещения в корзину
        }
    }
}

2. Запуск функции через WP-Cron раз в неделю

Чтобы регулярно очищать базу, создайте событие WP-Cron:

if (!wp_next_scheduled('wc_delete_inactive_variations_weekly')) {
    wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_variations_weekly');
}
add_action('wc_delete_inactive_variations_weekly', 'wc_delete_inactive_variations');

3. Ручной запуск для проверки

Для проверки можно вызвать функцию вручную в админке, например, через панель WP-CLI или подключив временно вызов функции в functions.php:

// wc_delete_inactive_variations(); // раскомментировать для теста и удалить после

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

  • Запустите функцию вручную и проверьте количество удалённых вариаций в административной части WooCommerce.
  • Проверьте, что количество вариаций в базе уменьшилось (через SQL-запрос или в админке).
  • Убедитесь, что активные и недавно используемые вариации остались на месте.
  • Проверьте логи ошибок и работоспособность сайта после автоматического запуска cron.

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

  • Функция ничего не удаляет: Проверьте правильность условий выборки и наличие вариаций, соответствующих критериям. Попробуйте вывести $variation_ids для отладки.
  • Удаляются нужные вариации: Проверьте корректность даты и статуса. Возможно, стоит увеличить порог в днях или добавить дополнительные проверки.
  • WP-Cron не срабатывает: Убедитесь, что на сайте регулярно посещают, либо настройте системный cron для запуска WP-Cron.
  • Ошибки при удалении: Проверьте права пользователя, под которым выполняется скрипт, и возможность удаления постов.

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

  • Используйте wp_delete_post($id, true) с параметром true, чтобы избежать накопления «корзины» и полностью удалить вариацию.
  • Ограничьте количество удаляемых записей за один запуск, чтобы избежать таймаутов. Например, добавьте LIMIT 50 в SQL-запрос и повторяйте вызов cron, пока есть что удалять.
  • Перед массовым удалением сделайте резервную копию базы.
  • Проверяйте совместимость с другими плагинами, которые могут зависеть от вариаций.
  • Для больших магазинов рассмотрите возможность выполнения удаления в несколько этапов с помощью AJAX или WP-CLI для минимизации нагрузки.

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

МетодПлагинКодКомпромисс
Удаление вручнуюОчень трудозатратно, риск пропуска
Плагин очистки WooCommerceДа (например, WP Optimize)Удобно, но нагрузка и зависимости
Автоматизация через кастомный кодНетДа, гибко и без лишних плагиновТребует навыков разработки и тестирования
Автоматический импорт из Google Sheets в WordPress
04.04.2026
Как отключить автоматическое удаление старых пустых сессий в WordPress
01.04.2026
Как удалить пустые meta-поля в WordPress
16.03.2026
WooCommerce: как автоматически удалять отменённые и завершённые заказы по дате без плагинов
09.05.2026
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
04.06.2026