Автоматическое удаление вариаций товаров WooCommerce после первого заказа

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

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

Типичные ситуации:

  • Ограниченный склад и уникальные варианты (цвет, размер и т.п.).
  • Избежание повторных продаж одной и той же вариации.
  • Автоматическая очистка каталога от проданных вариантов для упрощения управления.

Как определить, что вариация удаляется корректно

Перед автоматизацией важно проверить, что WooCommerce правильно идентифицирует вариацию, связанную с заказом. Для этого:

  • Создайте тестовый заказ с вариацией товара.
  • Через отладчик или логи найдите ID вариации из заказа.
  • Убедитесь, что при удалении вариация исчезает из каталога, но основные данные товара остаются.

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

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

add_action('woocommerce_order_status_completed', 'delete_variations_after_first_order', 10, 1);
function delete_variations_after_first_order($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) continue;

        // Проверяем, что это вариация
        if ($product->is_type('variation')) {
            $variation_id = $product->get_id();

            // Проверяем, не было ли уже заказов с этой вариацией
            $args = [
                'limit' => 1,
                'status' => ['completed', 'processing'],
                'meta_query' => [[
                    'key' => '_product_id',
                    'value' => $variation_id,
                    'compare' => '='
                ]],
            ];

            // Альтернативный способ проверки заказов с вариацией
            $has_orders = false;
            $orders = wc_get_orders(['limit' => -1, 'status' => ['completed', 'processing']]);
            foreach ($orders as $order_check) {
                foreach ($order_check->get_items() as $order_item) {
                    if ($order_item->get_product_id() == $variation_id) {
                        $has_orders = true;
                        break 2;
                    }
                }
            }

            // Удаляем вариацию, если это первый заказ
            if ($has_orders) {
                // Не удаляем, если есть другие заказы
                continue;
            } else {
                wp_delete_post($variation_id, true); // жесткое удаление
            }
        }
    }
}

Объяснение: Хук woocommerce_order_status_completed срабатывает при смене статуса заказа на «завершен». Функция проверяет все товары в заказе, и если это вариация, пытается удалить ее из базы, если это первый заказ с этой вариацией.

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

  • Создайте тестовый заказ с вариацией.
  • Обновите статус заказа на «завершен» в админке WooCommerce.
  • Проверьте, что вариация товара исчезла из каталога (раздел «Товары» в админке).
  • Создайте еще один заказ с этой же вариацией — он должен быть невозможен, так как вариация удалена.

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

  • Вариации не удаляются после заказа: Убедитесь, что хук woocommerce_order_status_completed срабатывает. Возможно, статус заказа не меняется на «завершен» автоматически — проверьте это вручную.
  • Удаляются не те товары: Проверьте, что условие $product->is_type('variation') корректно определяет вариации.
  • Ошибки в логах PHP: Проверьте синтаксис кода и наличие всех функций WooCommerce. Возможно, потребуется подключить зависимости.
  • Повторные заказы с удалённой вариацией: Очистите кэш сайта и браузера, убедитесь, что вариация действительно удалена, а не отключена.

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

  • Безопасность: Используйте wp_delete_post() с параметром true для полного удаления вариации, чтобы не оставлять «мусор» в базе.
  • Производительность: Проверка всех заказов в коде может стать узким местом на больших базах. Для оптимизации можно хранить в метаполях информацию о статусе вариации или использовать кеширование.
  • Резервное копирование: Перед внедрением автоматического удаления создайте резервную копию базы данных.

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

МетодПлюсыМинусы
Ручное удаление в админке WooCommerceПростота, контрольТрудозатратно при большом объеме
Автоматизация с хуком на статус заказа (код)Полное удаление без участия администратораТребует тестирования, нагрузка при большом кол-ве заказов
Использование сторонних плагиновГотовые решения, поддержкаМогут быть избыточными, влиять на производительность

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать хуки в WordPress для расширения функциональности
11.11.2025
Как создать автоматическую защиту от спама на формы WordPress без CAPTCHA
11.12.2025
Как автоматизировать обновление плагинов в WordPress без плагинов
03.01.2026
Как успешно использовать REST API WordPress для автоматизации задач
24.02.2026
Автоматическое удаление вариаций товаров WooCommerce после первого заказа
22.07.2026
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙