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

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

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

Чтобы понять, подходит ли вам этот подход, проверьте следующие моменты:

  • Есть ли в магазине товары, которые должны быть доступны только для одного заказа на весь магазин или на одного пользователя?
  • Необходимо ли удалять товар из каталога, чтобы он больше не отображался и не покупался?
  • Используется ли стандартная функциональность WooCommerce без сторонних плагинов, которые могут конфликтовать?

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

1. Определение момента заказа и проверки первого заказа с товаром

Используем хук woocommerce_thankyou, который срабатывает после оформления заказа. В обработчике проверим, является ли этот заказ первым, где есть данный товар, и если да — удалим товар.

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

add_action('woocommerce_thankyou', 'wc_auto_delete_product_after_first_order', 10, 1);
function wc_auto_delete_product_after_first_order($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // Получаем ID пользователя, оформившего заказ
    $user_id = $order->get_user_id();
    if (!$user_id) {
        // Удалять товары для гостей не рекомендуется
        return;
    }

    // Проходим по товарам заказа
    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();

        // Проверяем, был ли у пользователя ранее заказ с этим товаром
        $args = array(
            'limit' => 1,
            'customer_id' => $user_id,
            'status' => array('completed', 'processing', 'on-hold'),
            'exclude' => array($order_id),
            'return' => 'ids',
        );
        $orders = wc_get_orders($args);

        $has_bought_before = false;

        foreach ($orders as $prev_order_id) {
            $prev_order = wc_get_order($prev_order_id);
            foreach ($prev_order->get_items() as $prev_item) {
                if ($prev_item->get_product_id() == $product_id) {
                    $has_bought_before = true;
                    break 2;
                }
            }
        }

        // Если это первый заказ с этим товаром - удаляем товар из каталога
        if (!$has_bought_before) {
            wp_delete_post($product_id, true); // true - удаляет безвозвратно
        }
    }
}

3. Особенности и доработки

  • Удаление безвозвратно с помощью wp_delete_post с параметром true. Можно заменить на false, чтобы отправить в корзину.
  • Рассматриваем только зарегистрированных пользователей, для гостей логику нужно доработать.
  • Проверяем только заказы в статусах completed, processing, on-hold. Можно добавить или убрать статусы по необходимости.

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

  • Оформите тестовый заказ с новым пользователем на товар, которого еще нет в заказах.
  • После успешного оформления и перехода на страницу благодарности проверьте, что товар удален из каталога в админке и на сайте.
  • >
  • Попробуйте оформить повторный заказ с тем же товаром — он должен отсутствовать.
  • Сделайте заказ тем же товаром под другим пользователем, чтобы убедиться, что удаление происходит только после первого заказа.

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

  • Товар не удаляется после заказа
    Проверьте, что функция подключена и хук срабатывает. Добавьте error_log() внутри функции для отладки.
  • Удаляются товары, которые нельзя удалить
    Проверьте, что ID товара корректен и что это именно продукт WooCommerce (тип записи product).
  • Удаление влияет на гостевые заказы
    Логика не обрабатывает гостей, для них нужно добавить дополнительную логику, например, по email.
  • Пользователь может купить товар повторно, если заказ в неподходящем статусе
    Убедитесь, что статусы заказов в фильтре соответствуют бизнес-логике.
  • Потеря данных после удаления
    Рассмотрите возможность не удалять товар безвозвратно, а помечать его как архивный (через статус публикации).

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

  • Добавьте проверку nonce и права пользователя, если функция будет вызываться через AJAX или в других контекстах.
  • Для больших магазинов с сотнями заказов используйте кэширование результатов проверки, чтобы не нагружать базу.
  • Резервное копирование перед внедрением автоматического удаления обязательно.
  • Если требуется массовое удаление, лучше использовать WP CLI для ускорения и контроля процесса.
  • Для удобства и безопасности рассмотрите вариант не удаления, а изменения статуса публикации товара на draft или пользовательский статус.

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

МетодОписаниеПлюсыМинусы
Удаление через хук woocommerce_thankyouАвтоматическое удаление после оформления заказаПолная автоматизация, нет ручного трудаРиск потери данных, сложность при гостях
Ручное удаление товаров администраторомУдаление через админку по заказамКонтроль, безопасностьТрудоемко, ошибки при больших объемах
Изменение статуса товара на "черновик"Отключение товара без удаленияБезопасно, можно вернуть товарТовар остается в базе, не освобождает ID
Как удалить неиспользуемые таблицы в базе данных WordPress
27.03.2026
Как защитить WordPress от bruteforce атак
20.11.2025
Отложенная загрузка картинок в WordPress без плагинов: практическое руководство
11.12.2025
Как установить ограничения на количество публикаций для пользователей в WordPress
21.04.2026
WooCommerce: как отменить покупку после оплаты через код
29.05.2026