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

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

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

Неактивные вариации — это те, что не были куплены и не обновлялись, например, более 6 месяцев. Удаление таких записей помогает уменьшить нагрузку на запросы и ускорить бэкапы.

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

Шаг 1. Определение критериев отбора

Для удаления будем использовать дату последнего обновления вариации (post_modified) или дату последней покупки (если доступна). В этом примере реализуем удаление по дате обновления вариации — если она не менялась больше 180 дней.

Шаг 2. Создание PHP-функции для удаления

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

function wpcore_delete_old_inactive_variations() {
    global $wpdb;
    $days_inactive = 180; // количество дней без обновления
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));

    // Получаем ID вариаций (post_type = 'product_variation'), не обновлявшихся более 180 дней
    $variation_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_modified < %s",
        $date_threshold
    ));

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $variation_id) {
            // Проверяем, что вариация не связана с активным заказом (опционально)
            // Можно добавить дополнительную проверку наличия заказов с этим товаром

            // Удаляем вариацию
            wp_delete_post($variation_id, true); // true — без помещения в корзину
        }
    }
}

// Запускаем функцию через WP-Cron раз в неделю
add_action('wpcore_weekly_variation_cleanup', 'wpcore_delete_old_inactive_variations');

function wpcore_setup_weekly_event() {
    if (!wp_next_scheduled('wpcore_weekly_variation_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpcore_weekly_variation_cleanup');
    }
}
add_action('wp', 'wpcore_setup_weekly_event');

Шаг 3. Тестирование функции вручную

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

wp eval 'wpcore_delete_old_inactive_variations();'

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

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

1. Зайдите в админку WooCommerce –> Товары –> Вариации и проверьте количество вариаций до и после запуска скрипта.

2. Выполните SQL-запрос напрямую в базе, чтобы убедиться, что нет вариаций, у которых post_modified старше 180 дней:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_modified < DATE_SUB(NOW(), INTERVAL 180 DAY);

Если возвращается 0, значит старые вариации успешно удалены.

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

  • Удаление нужных вариаций: если в магазине есть вариации, которые не обновлялись долго, но нужны (например, архивные), добавьте дополнительную логику или метаполя для исключения их из удаления.
  • Потеря данных заказов: не удаляйте вариации, связанные с активными или завершёнными заказами. Для этого можно дополнительно проверить таблицы заказов WooCommerce (wp_woocommerce_order_items и wp_woocommerce_order_itemmeta).
  • Отсутствие Cron: WP-Cron запускается при посещении сайта. Если трафика мало, можно настроить системный cron для запуска wp-cron.php по расписанию.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением записей.
  • Добавьте логирование удалённых вариаций (через error_log или в отдельный файл), чтобы отслеживать изменения.
  • Используйте wp_delete_post с параметром true, чтобы полностью удалить вариацию без помещения в корзину.
  • Для больших магазинов с тысячами вариаций запускайте удаление пакетами, чтобы избежать таймаутов.
  • Оптимизируйте базу данных после удаления (через phpMyAdmin или WP-CLI команду wp db optimize).

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

МетодПлюсыМинусыПример
Ручное удаление через админку Просто, не требует кода Долго, не подходит для большого количества WooCommerce > Товары > Вариации
Плагин очистки базы Автоматизация, удобный интерфейс Дополнительная нагрузка, возможны конфликты Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcore.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-neaktivnyh-variantov-tovarov-po-datam)
Код на PHP с WP-Cron Гибкость, контроль, без плагинов Требует навыков, нужно тестировать Пример из статьи выше
Оптимизация базы данных WordPress: эффективные методы и примеры кода
15.11.2025
Как удалить заблокированные пользователи WordPress
18.02.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров без плагинов
16.06.2026
Как безопасно удалить старые записи по метаданным в WordPress
20.01.2026
Как удалить все комментарии в WordPress быстро и безопасно
05.12.2025