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

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

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

Задача — автоматически находить и удалять неактивные варианты (variations), которые не использовались или не обновлялись длительное время, например, 90 дней. При этом нужно сделать это без плагинов, чтобы уменьшить нагрузку и сохранить контроль над процессом.

Как проверить, есть ли неактивные варианты в WooCommerce

  • В админке WooCommerce перейдите в раздел Товары > Вариации (если такой нет, откройте товар с вариациями и посмотрите список вариаций).
  • Обратите внимание на вариации со статусом draft или private, либо на те, у которых в метаданных нет продаж и обновлений.
  • Подключитесь к базе данных и выполните SQL-запрос, чтобы найти вариации без заказов и обновлений:
    SELECT p.ID, p.post_title, p.post_status FROM wp_posts p LEFT JOIN wp_woocommerce_order_items oi ON p.ID = oi.order_item_id WHERE p.post_type = 'product_variation' AND p.post_modified < DATE_SUB(NOW(), INTERVAL 90 DAY) AND oi.order_item_id IS NULL;

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

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

function wpb_delete_inactive_variations() {
    global $wpdb;
    $days_inactive = 90; // период бездействия в днях
    
    // Получаем ID вариаций, которые не обновлялись более 90 дней и не были в заказах
    $query = $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN (SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items) oi ON p.ID = oi.order_item_id
        WHERE p.post_type = 'product_variation'
        AND p.post_modified < %s
        AND oi.order_item_id IS NULL",
        date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"))
    );
    $inactive_variations = $wpdb->get_col($query);
    
    if (empty($inactive_variations)) {
        return;
    }

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

2. Зарегистрируйте WP-Cron событие для регулярного запуска

if (!wp_next_scheduled('wpb_delete_variations_daily')) {
    wp_schedule_event(time(), 'daily', 'wpb_delete_variations_daily');
}

add_action('wpb_delete_variations_daily', 'wpb_delete_inactive_variations');

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

Так вы сможете управлять кодом централизованно и избежать удаления при смене темы.

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

  • Выполните вручную запуск функции из консоли WP-CLI: wp eval 'wpb_delete_inactive_variations();' и проверьте логи ошибок.
  • Перед и после запуска функции выполните SQL-запрос из раздела диагностики, чтобы убедиться, что неактивные вариации удалены.
  • Проверьте в админке WooCommerce — вариации должны исчезнуть.
  • Убедитесь, что на фронтенде сайта нет ошибок и товары отображаются корректно.

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

  • Ошибка: Нет эффекта от cron-задачи. Проверьте, что WP-Cron работает (например, запустите wp cron event run wpb_delete_variations_daily). Если сайт с низкой посещаемостью — cron может не запускаться автоматически, используйте системный cron для вызова wp-cron.php.
  • Удаляются нужные варианты. Проверьте логику фильтрации по дате и заказам. Добавьте дополнительные проверки перед удалением, например, статус вариации publish.
  • Производительность падает при выполнении функции. Ограничьте количество удаляемых вариаций за один запуск функцией array_slice() или используйте пагинацию в SQL.

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

  • Всегда делайте резервную копию базы перед запуском автоматических удалений.
  • Для больших магазинов лучше разбить удаление на несколько этапов, чтобы не нагружать сервер.
  • Используйте транзиенты или опцию для хранения времени последнего запуска, чтобы не запускать функцию чаще, чем нужно.
  • Для надежности cron-задачи на продакшене настройте системный cron вызова WP-Cron: * * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Если вы используете WPShop Clearfy Pro, он может помочь с очисткой и оптимизацией базы без лишнего кода: https://wpshop.ru/plugins/clearfy
WooCommerce AJAX обновление корзины без перезагрузки страницы: практическое руководство
20.04.2026
WooCommerce: как автоматически удалять неактивные варианты товара
27.06.2026
Как отключить Emoji в WordPress для ускорения сайта
10.04.2026
Автоматическое удаление неактивных вариантов товаров в WooCommerce
26.04.2026
Как добавить уникальные метаданные для продуктов WooCommerce и вывести их на страницу товара
07.02.2026