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

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

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

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

Под неиспользуемыми вариациями мы понимаем вариации, которые:

  • Уже не продаются, т.е. их запас равен нулю и не пополняется;
  • Не отображаются в каталоге;
  • Не связаны с активными заказами;
  • Не используются в других местах сайта, например, в избранном или отложенных товарах.

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

1. Подключение к хуку завершения заказа

Для запуска проверки и удаления неиспользуемых вариаций будем использовать хук woocommerce_order_status_completed. Это событие срабатывает, когда заказ переведен в статус "завершен".

2. Определение вариаций из заказа и проверка их запаса

Из заказа нужно получить все вариации и проверить их наличие на складе. Если запас равен нулю, запускаем удаление.

3. Удаление вариаций с помощью функции wp_delete_post

Удаление вариации — это удаление поста типа product_variation в базе WordPress.

Пример кода для functions.php или собственного плагина:

add_action('woocommerce_order_status_completed', 'auto_delete_unused_variations_after_sale', 10, 1); 
function auto_delete_unused_variations_after_sale($order_id) {
    if (!$order_id) {
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    foreach ($order->get_items() as $item) {
        $product = $item->get_product();

        // Проверяем, что продукт — вариация
        if ($product && $product->is_type('variation')) {
            $stock_quantity = $product->get_stock_quantity();
            $manage_stock = $product->managing_stock();

            // Удаляем вариацию, если управляем запасом и количество 0 или меньше
            if ($manage_stock && $stock_quantity <= 0) {
                wp_delete_post($product->get_id(), true); // true — принудительное удаление без корзины
            }
        }
    }
}

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

  1. Создайте тестовый заказ с вариацией товара, у которой запас равен 1.
  2. Завершите заказ через админку или через фронтенд.
  3. После завершения заказа проверьте, уменьшился ли запас вариации. Если запас стал 0, вариация должна удалиться из базы.
  4. Проверьте наличие вариации в списке товаров WooCommerce — её не должно быть.
  5. Если вариация не удалена — проверьте логи ошибок и права пользователя, под которым запускается код.

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

  • Вариации не удаляются: проверьте, что функция вызывается при смене статуса заказа. Логируйте вызов функции и ID вариаций для отладки.
  • Удаляются нужные вариации: убедитесь, что проверка запаса корректна и не затрагивает вариации с положительным остатком.
  • Ошибка прав доступа: функция wp_delete_post требует определенных прав. Запускать код лучше от имени администратора или в контексте WordPress с полными правами.
  • Конфликты с другими плагинами: отключите кеширование на время теста, чтобы увидеть реальные изменения.

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

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

Сравнение подходов удаления вариаций

ПодходПреимуществаНедостатки
Удаление вручную через админкуПростой контроль, не требует кодаТрудозатратно, ошибочно можно удалить нужные вариации
Автоматическое удаление через код (хук заказа)Экономит время, точечное удалениеТребует тестирования, возможны ошибки при неправильной логике
Плагины очистки товаровГотовые решения с интерфейсомМогут замедлять сайт, не всегда гибкие
Как избежать проблем с пересчетом цен в WooCommerce при использовании купонов
09.06.2026
Логика оценки продуктивности в WordPress: практическое руководство с примерами
31.12.2025
Как использовать REST API в WordPress для создания настроек
26.11.2025
Как удалить дубликаты постов в WordPress с помощью кода
08.03.2026
WooCommerce: автоматическое удаление неиспользуемых вариаций товаров после продажи
17.07.2026