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

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

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

Чтобы проверить наличие таких вариаций, зайдите в админку WordPress, откройте раздел Товары > Все товары и выберите товар с вариациями. Если в списке вариаций много элементов, которые не используются (например, устаревшие цвета или размеры), это повод для очистки.

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND ID NOT IN (SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE meta_key = '_product_id');

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

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

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

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

function wptest_delete_old_variations() {
    global $wpdb;

    // Получаем ID вариаций, которые не связаны с заказами
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON p.ID = oim.meta_value
        WHERE p.post_type = 'product_variation'
        AND oim.meta_value IS NULL
        AND p.post_date < NOW() - INTERVAL 180 DAY"
    );

    if (empty($variations)) {
        return 'Нет старых вариаций для удаления';
    }

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

    return 'Удалено ' . count($variations) . ' старых вариаций';
}

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

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

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_old_variations'])) {
        $result = wptest_delete_old_variations();
        echo '<div class="notice notice-success is-dismissible">' . esc_html($result) . '</div>';
    }
});

После проверки работоспособности можно настроить автоматический запуск раз в неделю через WP-Cron:

if (!wp_next_scheduled('wptest_weekly_delete_variations')) {
    wp_schedule_event(time(), 'weekly', 'wptest_weekly_delete_variations');
}
add_action('wptest_weekly_delete_variations', 'wptest_delete_old_variations');

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

  • Зайдите в раздел «Товары» и проверьте количество вариаций для товаров с большим количеством вариантов.
  • Повторите SQL-запрос из раздела диагностики, чтобы убедиться, что количество неиспользуемых вариаций уменьшилось.
  • Проверьте журнал ошибок сервера и логи WooCommerce на предмет исключений при запуске функции.

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

  • Удаление нужных вариаций: Убедитесь, что в SQL-запросе правильно настроен фильтр по дате и отсутствию заказов. Некорректный запрос может удалить активные варианты.
  • Функция не запускается по Cron: Проверьте, что WP-Cron работает на вашем хостинге. Для диагностики можно использовать плагин WP Crontrol.
  • Производительность: Если товаров и вариаций очень много, запрос может быть тяжелым. Разбейте удаление на батчи, например, 50 вариаций за один запуск.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением данных.
  • Добавьте логирование удалённых вариаций в файл для последующего анализа.
  • Для больших магазинов используйте WP-CLI для запуска очистки через командную строку, чтобы избежать таймаутов.
  • При использовании WP-Cron настройте внешний системный cron на хостинге для надежного запуска задач.

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

СпособПреимуществаНедостаткиКомпромисс
Ручное удаление через админкуПростота, контрольДолго при большом количествеПодходит для небольших магазинов
Автоматический скрипт в functions.phpАвтоматизация, гибкостьРиск ошибки при некорректном кодеНужно тестировать и логировать
WP-CLI скриптБыстро, без таймаутовТребуется доступ к серверуОптимально для больших магазинов
WooCommerce: как автоматически удалять неактивных пользователей
30.06.2026
WordPress: как добавить собственные метаполя в посты
19.11.2025
Как добавить автоматическое удаление старых записей через WP-Cron в WordPress
31.01.2026
Автоматическое удаление старых записей в WordPress через WP-Cron
30.03.2026
Как избежать проблем с загрузкой больших файлов в WordPress
14.06.2026