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

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

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

Пошаговое решение: удаление товара после оплаты

1. Подключение к хуку смены статуса заказа

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

2. Получение товаров из заказа

Из объекта заказа получаем все позиции товаров, чтобы затем удалить соответствующие записи товаров.

3. Удаление товаров программно

Удаляем товары вызовом функции wp_delete_post с ID товара. Важно указать аргумент true, чтобы удалить пост без возможности восстановления.

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

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        if ($product_id) {
            wp_delete_post($product_id, true); // удаляем товар без возможности восстановления
        }
    }
}

4. Дополнительные проверки перед удалением

Чтобы не удалять товары случайно, можно добавить проверку категории или метаполя, например, только удалять товары из категории "Уникальные". Это снизит риск ошибок.

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

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        if ($product_id && has_term('unikalnye', 'product_cat', $product_id)) {
            wp_delete_post($product_id, true);
        }
    }
}

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

  • Создайте тестовый товар в категории "Уникальные".
  • Создайте заказ с этим товаром и оплатите его (можно в режиме теста).
  • После смены статуса заказа на "завершён" проверьте, что товар удалился из каталога (админка WooCommerce — Товары).
  • Если товар остался, проверьте логи ошибок и наличие категории у товара.

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

  • Товар не удаляется: Проверьте, правильно ли указан ID товара, и что хук срабатывает при смене статуса. Используйте error_log для отладки.
  • Удаляются не те товары: Добавьте фильтр по категории или метаполю, чтобы ограничить действие.
  • Удаление вызывает ошибки: Убедитесь, что у пользователя, под которым работает код, есть права на удаление постов.
  • Удалённый товар остаётся в кэше: Очистите кэш сайта и браузера после тестирования.

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

  • Удаляйте товары только после подтверждения оплаты — используйте статус completed, а не processing, чтобы избежать удаления при отменённых платежах.
  • Для больших заказов с множеством товаров можно реализовать пакетное удаление с ограничением по времени выполнения, чтобы избежать таймаутов PHP.
  • Резервное копирование перед внедрением кода — обязательно, чтобы восстановить данные при ошибках.
  • Для сайтов с высокой нагрузкой удаление товаров вручную может быть затратным — рассмотрите отложенное удаление через крон-задачи.

Сравнение вариантов реализации

МетодОписаниеПлюсыМинусы
Код через хук woocommerce_order_status_completedПрямое удаление товара после оплатыПростота, контрольРиск удаления нужных товаров, требует проверки
Плагин для управления товарамиИспользование готовых решений с настройкамиУдобство, интерфейсМожет быть избыточным, нагрузка
Отложенное удаление через WP-CronУдаление по расписанию после проверкиБезопаснее, меньше риска ошибокЗадержки в удалении
Как использовать WPRemark для повышения вовлечённости пользователей в WordPress
14.01.2026
WooCommerce: как автоматически удалять заказы по статусу после оплаты
11.06.2026
Как использовать REST API для создания простого плагина WordPress
03.12.2025
Как отключить кэширование страницы корзины в WooCommerce для корректной работы
28.04.2026
Как добавить многоязычность в WordPress без плагинов
12.02.2026