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

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

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

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

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

  • Не были проданы и не просматривались длительное время (например, >6 месяцев).
  • Неактивны или отключены в настройках товара.
  • Имеют нулевой остаток и не планируются к пополнению.

Для анализа можно использовать SQL-запросы к базе данных или плагины для отчетности по WooCommerce, например, Clearfy Pro с функциями оптимизации базы.

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

1. Создаем WP-Cron для регулярной проверки и очистки

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

if (!wp_next_scheduled('wc_delete_unused_variations_weekly')) {
    wp_schedule_event(time(), 'weekly', 'wc_delete_unused_variations_weekly');
}

add_action('wc_delete_unused_variations_weekly', 'wc_delete_unused_variations');

function wc_delete_unused_variations() {
    global $wpdb;

    $threshold_date = 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->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
         WHERE p.post_type = 'product_variation'
         AND p.post_modified < %s
         AND (oi.order_item_id IS NULL OR oi.order_item_id NOT IN (
             SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items oi2
             JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oim2.order_item_id = oi2.order_item_id
             JOIN {$wpdb->posts} orders ON orders.ID = oi2.order_id
             WHERE oim2.meta_key = '_product_id' AND oim2.meta_value = p.ID AND orders.post_date >= %s
         ))",
         $threshold_date, $threshold_date
    ));

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

2. Оптимизация и проверка остатков

Можно добавить дополнительную проверку, чтобы не удалять вариации с остатками:

function wc_delete_unused_variations() {
    global $wpdb;

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

    $variations = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->postmeta} pm_stock ON pm_stock.post_id = p.ID AND pm_stock.meta_key = '_stock'
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.meta_value = p.ID
         LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
         WHERE p.post_type = 'product_variation'
         AND p.post_modified < %s
         AND (oi.order_item_id IS NULL OR oi.order_item_id NOT IN (
             SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items oi2
             JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2 ON oim2.order_item_id = oi2.order_item_id
             JOIN {$wpdb->posts} orders ON orders.ID = oi2.order_id
             WHERE oim2.meta_key = '_product_id' AND oim2.meta_value = p.ID AND orders.post_date >= %s
         ))
         AND (pm_stock.meta_value IS NULL OR pm_stock.meta_value = '0')",
         $threshold_date, $threshold_date
    ));

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }
}

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

  • Проверьте наличие запланированного события WP-Cron командой wp cron event list или плагином WP Crontrol.
  • После выполнения события проверьте, что вариации с датой изменения более 6 месяцев и без продаж удалены в админке WooCommerce.
  • Для контроля можно добавить логирование удалений, например, в файл или в системный лог.

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

  • Удаление активных вариаций: Проверьте условия в SQL-запросе, чтобы не затронуть товары с остатком или недавними продажами.
  • WP-Cron не запускается автоматически: На некоторых серверах WP-Cron работает только при посещении сайта. Рекомендуется настроить системный cron для запуска wp cron event run --due-now.
  • Проблемы с правами: Убедитесь, что у пользователя, от имени которого работает скрипт, есть права на удаление постов.
  • Потеря данных: Всегда делайте резервную копию базы данных перед массовым удалением.

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

  • Используйте транзакции или делайте удаление частями, чтобы не перегружать базу при больших объемах данных.
  • Добавьте логирование удалений для аудита и отката при необходимости.
  • Перед внедрением на рабочем сайте протестируйте на копии или в staging-среде.
  • Используйте плагины оптимизации, например Clearfy Pro, для дополнительной очистки и ускорения WooCommerce.

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

МетодПреимуществаНедостатки
Ручное удаление в админкеПростой, не требует кодаТрудоемко, риск ошибок, не подходит для большого количества
SQL-запросы напрямую в базеБыстрое массовое удалениеРиск повреждения данных, требует навыков SQL
Автоматизация через WP-Cron и PHPРегулярная чистка, безопаснее, можно настроить условияТребует правильной настройки и тестирования
Плагины оптимизации (например, Clearfy Pro)Простота использования, дополнительно ускоряют сайтМожет быть платным, зависит от функционала плагина
Как автоматически удалять неиспользуемые медиа файлы в WordPress
26.02.2026
Как использовать WP-Cron для автоматического удаления нерабочих изображений в WordPress
08.06.2026
Автоматическое обновление стоимости товара в WooCommerce при изменении атрибутов
18.04.2026
Как создать успешный плагин для WordPress: практические советы и примеры кода
01.01.2026
Как использовать WP-Cron для автоматического удаления заброшенных корзин в WooCommerce
26.06.2026