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

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

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

Часто администраторы сайта не замечают, что старые вариации продолжают занимать место в базе данных и влияют на производительность. Проверить наличие таких вариаций можно с помощью SQL-запросов к таблице wp_posts с типом записи product_variation и фильтрацией по дате или активности.

SELECT ID, post_title, post_modified FROM wp_posts WHERE post_type = 'product_variation' ORDER BY post_modified ASC LIMIT 20;

Этот запрос покажет 20 самых «старых» вариаций. Если эти вариации относятся к давно удалённым или изменённым товарам, их стоит очистить.

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

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

  • Вариация не имеет заказов (нет связанных записей в wp_woocommerce_order_items).
  • Вариация не обновлялась более 6 месяцев.
  • Вариация не связана с активным товаром.

2. Создаём PHP-функцию для удаления вариаций

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

function delete_unused_product_variations() {
    global $wpdb;

    $six_months_ago = date('Y-m-d H:i:s', strtotime('-6 months'));

    // Получаем ID вариаций, которые не обновлялись более 6 месяцев
    $variations = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
         LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID
         WHERE p.post_type = 'product_variation'
         AND p.post_modified < %s
         AND oim.meta_value IS NULL
         AND (parent.post_status = 'publish' OR parent.post_status = 'private')",
        $six_months_ago
    ));

    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // Полное удаление без перемещения в корзину
        }
    }
}

3. Настраиваем автоматический запуск через WP-Cron

Добавьте запуск функции раз в неделю:

if (!wp_next_scheduled('delete_unused_variations_weekly')) {
    wp_schedule_event(time(), 'weekly', 'delete_unused_variations_weekly');
}
add_action('delete_unused_variations_weekly', 'delete_unused_product_variations');

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

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

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

  • Удаление нужных вариаций: Если критерии удаления слишком жёсткие — случайно удалятся активные вариации. Проверьте, что условие проверки заказа и статуса родительского товара корректно написано.
  • Проблемы с WP-Cron: Если задания не выполняются, проверьте, не отключен ли WP-Cron на сервере (constant DISABLE_WP_CRON), и работает ли имитация cron-запусков.
  • Ошибка прав доступа: Функция wp_delete_post требует прав администратора. Убедитесь, что код запускается с нужными правами.

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

  • Перед включением автоматического удаления сделайте резервную копию базы данных, чтобы можно было восстановить данные при ошибке.
  • Ограничьте выполнение удаления вариаций в низкие часы нагрузки сервера.
  • Для больших баз данных используйте пакетную обработку — удаляйте вариации частями, чтобы избежать таймаутов.
  • Для мониторинга ошибок подключите логирование удаления в отдельный файл с указанием ID удалённых вариаций.
  • Рассмотрите использование плагина Clearfy Pro (ссылка) для дополнительной оптимизации WooCommerce и очистки базы.

Сравнение способов удаления неиспользуемых вариаций

СпособПреимуществаНедостатки
Ручное удаление через админкуПростота, контроль каждого вариантаТрудоёмко, риск пропуска вариаций
Автоматический скрипт (код)Автоматизация, экономия времени, точные критерииТребует тестирования и контроля, возможны ошибки при неправильных условиях
Плагины для очистки базыУдобство интерфейса, дополнительные функции оптимизацииЗависимость от стороннего кода, возможны конфликты
Как настроить удалённый запуск задач в WordPress с помощью WP-Cron
20.01.2026
Как отключить Emoji в WordPress для ускорения сайта
07.12.2025
Как удалить пустые HTML-теги в WordPress
02.01.2026
Оптимизация загрузки изображений в WordPress с помощью ленивой загрузки (lazy load)
23.12.2025
Как использовать MetaBox для создания собственных пользовательских полей в WordPress
05.04.2026