Автоматическое удаление старых вариаций товаров WooCommerce с помощью WP-Cron

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

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

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

Как настроить автоматическое удаление старых вариаций с помощью WP-Cron

1. Определяем критерии для удаления вариаций

Для начала нужно понять, какие вариации считать устаревшими. Например, варианты, которые:

  • не были обновлены более 30 дней;
  • не привязаны к активным товарам;
  • имеют статус "trash" (удалены, но не очищены).

2. Реализация функции удаления

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

function wpmy_delete_old_product_variations() {
    global $wpdb;

    // Определяем дату 30 дней назад
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Получаем ID вариаций, которые не обновлялись более 30 дней и не в статусе publish
    $variations = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'product_variation' 
           AND post_modified < %s 
           AND post_status != 'publish'",
        $date_threshold
    ));

    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // Полное удаление
        }
    }
}

3. Регистрация задачи WP-Cron

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

function wpmy_schedule_old_variations_cleanup() {
    if (!wp_next_scheduled('wpmy_daily_variations_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpmy_daily_variations_cleanup');
    }
}
add_action('wp', 'wpmy_schedule_old_variations_cleanup');

add_action('wpmy_daily_variations_cleanup', 'wpmy_delete_old_product_variations');

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

Чтобы убедиться, что скрипт работает:

  • Запустите функцию вручную, вызвав wpmy_delete_old_product_variations() из консоли WP-CLI или временно через вызов в коде.
  • Проверьте базу данных: вариации с устаревшей датой модификации и статусом, отличным от publish, должны быть удалены.
  • Наблюдайте за логами сервера и debug.log на предмет ошибок.
  • Через 24 часа проверьте, что WP-Cron сработал, например, с помощью плагина WP Crontrol.

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

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

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

  • Для защиты от случайного удаления добавьте дополнительную проверку: например, удаляйте только вариации с определённым мета-полем _auto_delete, которое вы ставите вручную или через обновление.
  • Используйте транзакции базы данных, если планируете сложные операции.
  • Логируйте удалённые ID вариаций в отдельный файл или опцию, чтобы можно было восстановить данные при необходимости.
  • Если WP-Cron ненадёжен из-за низкой посещаемости сайта, настройте системный cron на сервере для вызова wp-cron.php.

Сравнение способов автоматической очистки вариаций

МетодПлюсыМинусыПример
WP-Cron с кастомной функциейГибкость, можно адаптировать под любые условияЗависит от посещаемости сайтаКод из статьи
Плагины очистки WooCommerceПростота установки, не требует кодаМеньшая гибкость, могут быть платнымиWP Sweep, Advanced Database Cleaner
Ручное удаление через SQL или админкуПолный контрольРиск ошибок, требует навыковЗапросы в phpMyAdmin
Как использовать WPGraphQL для автоматизации задач WordPress
03.02.2026
Как удалить удалённые публикации в WordPress через REST API с примерами кода
22.12.2025
WooCommerce: правильное отображение вариаций товаров — практическое руководство
17.05.2026
Ограничение на загрузку файлов в WordPress: настройка и примеры
16.04.2026
Как динамически изменить заголовок страницы в WordPress
11.02.2026