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

Диагностика проблемы с устаревшими вариациями в WooCommerce

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

SELECT ID, post_title FROM wp_posts WHERE post_type = 'product_variation' AND post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type = 'product');

Этот запрос выявит вариации, у которых отсутствуют родительские товары — явный признак устаревших вариаций.

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

1. Создаем функцию для удаления вариаций без родительских товаров

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

function wc_delete_orphan_product_variations() {
    global $wpdb;
    // Получаем ID вариаций, у которых нет родителя
    $orphans = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         WHERE p.post_type = 'product_variation'
         AND p.post_parent NOT IN (SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status IN ('publish', 'private', 'draft'))"
    );

    if (!empty($orphans)) {
        foreach ($orphans as $variation_id) {
            wp_delete_post($variation_id, true); // Жесткое удаление
        }
        return count($orphans);
    }
    return 0;
}

2. Запускаем функцию по расписанию WP-Cron

Чтобы не запускать вручную, организуем периодическое удаление:

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

add_action('wc_variation_cleanup_event', function() {
    $deleted = wc_delete_orphan_product_variations();
    if ($deleted) {
        error_log("Удалено устаревших вариаций: " . $deleted);
    }
});

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

Для проверки эффективности очистки:

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

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

1. Удаление активных вариаций

Причина: в запросе не учитываются все статусы товаров, например, если товар в статусе "pending" или "trash" — вариации сохраняются и не удаляются. Убедитесь, что в подзапросе указаны все релевантные статусы.

2. WP-Cron не запускается из-за отсутствия посещений сайта

WP-Cron зависит от посещений сайта, что может вызвать задержки. Для надёжности настройте системный cron на сервере или используйте сторонние сервисы, вызывающие wp-cron.php.

3. Ошибки прав доступа при удалении

Если функция wp_delete_post не работает, проверьте права пользователя, под которым выполняется скрипт, и права на удаление записей в базе данных.

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

  • Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • В логах фиксируйте количество удалённых вариаций для мониторинга.
  • Если у вас крупный магазин с тысячами вариаций, разбивайте удаление на порции, чтобы избежать таймаутов PHP.
  • Реализуйте механизмы уведомлений (например, отправка email с результатом очистки).

Сравнение вариантов автоматического удаления вариаций

МетодПлюсыМинусыРекомендации
Плагин для чистки WooCommerceГотовое решение, удобный интерфейсМожет быть тяжеловесным, не всегда бесплатнымПодходит для небольших магазинов
Ручной SQL-запросБыстрый и точныйРиск ошибки при неправильном запросеИспользовать для разовых операций
Автоматизация через WP-Cron + кодПолный контроль, автоматизацияТребует знаний PHP и WordPress APIОптимально для регулярного обслуживания
Как создать автоматический отчёт по ошибкам WordPress с уведомлениями
06.04.2026
Автоматический импорт постов в WordPress: плагины и кастомные решения
05.01.2026
WordPress: как создать собственный тип записи (custom post type)
23.11.2025
Как сделать автоматический импорт постов в WordPress с помощью плагинов и кода
21.01.2026
Как отправить форму на Telegram из WordPress без плагинов
11.03.2026