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

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

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

  • замедлению работы админки и сайта;
  • увеличению размера базы данных;
  • ошибкам синхронизации и конфликтам при обновлениях;
  • путанице в управлении товарами.

Автоматизация удаления таких вариантов — подходящая практика для поддержания чистоты и производительности WooCommerce.

Как определить старые вариации для удаления

Важно чётко определить критерии, по которым вариации считаются «старыми». Чаще всего используют один или несколько из следующих параметров:

  • дата последнего изменения вариации (post_modified);
  • статус вариации (например, черновик или скрытый);
  • отсутствие заказов или просмотров;
  • наличие определённых мета-полей с пометкой устаревшего варианта.

В стандартной базе WooCommerce вариации — это посты типа product_variation, связанные с основным товаром.

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

Ниже пример функции, которая удаляет вариации товаров, не обновлявшиеся более 180 дней. Код можно добавить в functions.php темы или в собственный плагин.

function remove_old_product_variations() {
    global $wpdb;
    $days_threshold = 180; // число дней без обновлений
    $date_limit = date('Y-m-d H:i:s', strtotime("-" . $days_threshold . " days"));

    // Получаем ID вариаций, где post_modified старше даты
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->prefix}posts 
         WHERE post_type = 'product_variation' 
         AND post_modified < %s",
        $date_limit
    );

    $variation_ids = $wpdb->get_col($query);

    foreach ($variation_ids as $variation_id) {
        wp_delete_post($variation_id, true); // принудительное удаление
    }
}

// Добавим в WP-Cron для ежедневного запуска
if (!wp_next_scheduled('daily_remove_old_variations')) {
    wp_schedule_event(time(), 'daily', 'daily_remove_old_variations');
}
add_action('daily_remove_old_variations', 'remove_old_product_variations');

Объяснение кода:

  • Выбираются вариации, которые не обновлялись более 180 дней;
  • Функция wp_delete_post удаляет вариацию без возможности восстановления (второй параметр true);
  • Запуск по расписанию — раз в сутки через WP-Cron.

Как проверить, что автоматическое удаление сработало

  • В админке WooCommerce проверьте вкладку вариаций у товаров — количество устаревших вариантов должно уменьшиться.
  • В базе данных в таблице wp_posts убедитесь, что записи с post_type = 'product_variation' и старой датой отсутствуют.
  • Добавьте логирование в функцию, например через error_log(), чтобы фиксировать ID удалённых вариаций.

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

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

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

  • Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • Добавьте логи и уведомления на email о количестве удалённых вариаций.
  • Для больших магазинов лучше разбивать удаление на части, например по 50 вариаций за запуск, чтобы не перегружать сервер.
  • Регулярно очищайте кэш сайта и базы данных, чтобы избежать задержек в отображении актуальных данных.
  • Можно применить WP-CLI для проверки и удаления вариаций вручную при отладке:
wp post delete $(wp post list --post_type=product_variation --field=ID --date_query_column=post_modified --before='180 days ago') --force

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

МетодПлюсыМинусыРекомендации
Ручное удаление в админкеПростота, контрольТрудозатратно, риск пропуститьПодходит для небольших магазинов
Автоматический скрипт с WP-CronАвтоматизация, регулярностьРиск ошибок без проверки, нагрузкаИспользовать с логированием и тестами
Плагины очистки и оптимизацииУдобство, дополнительные функцииМогут удалять лишнее, нагрузкаИспользовать проверенные решения, комбинировать с кастомным скриптом
Как удалить заблокированные аккаунты WordPress без риска
20.05.2026
Использование REST API для синхронизации пользователей и ролей WooCommerce между сайтами WordPress
23.05.2026
Как сделать свойства пользователя в WordPress через пользовательские мета-поля
07.03.2026
Как синхронизировать перемещаемые поля ACF между сайтами WordPress
11.02.2026
Автоматическое удаление старых вариантов товаров WooCommerce: практическое руководство
25.07.2026