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

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

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

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

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

Для запуска удаления товара нужно поймать событие успешной оплаты заказа. В WooCommerce для этого подходит хук woocommerce_order_status_completed — он срабатывает, когда заказ переводится в статус "завершён" (completed), что означает успешную оплату и обработку.

Пример использования:

add_action('woocommerce_order_status_completed', 'delete_products_after_payment', 10, 1);

Пошаговое решение: удаление товаров из заказа

1. Подключаем функцию к хуку woocommerce_order_status_completed.
2. Получаем из заказа ID продуктов.
3. Удаляем каждый продукт программно с помощью функции wp_delete_post( $product_id, true ) (второй аргумент true для безвозвратного удаления).
4. Логируем или отправляем уведомление, чтобы отследить успешное удаление.

Код решения:

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

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

    $deleted_products = [];
    foreach ( $order->get_items() as $item ) {
        $product_id = $item->get_product_id();
        if ( $product_id ) {
            // Удаляем товар навсегда
            wp_delete_post( $product_id, true );
            $deleted_products[] = $product_id;
        }
    }

    if ( ! empty( $deleted_products ) ) {
        error_log( 'Deleted products after payment: ' . implode( ',', $deleted_products ) );
    }
}

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

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

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

  • Товары не удаляются: Проверьте правильность подключения функции к хуку, наличие прав на удаление постов, статус заказа должен быть "completed".
  • Удаляются не те товары: Убедитесь, что берется именно $item->get_product_id(), а не $item->get_variation_id(), если вариации не должны удаляться.
  • Потеря данных о товаре: Удаление товара необратимо, всегда делайте резервные копии базы данных перед внедрением.

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

  • Добавьте проверку пользовательских ролей или метаполей товара, чтобы удалять только определённые товары, например, с меткой "одноразовый".
  • Используйте транзакции базы данных, если используете сложные операции с заказами и товарами, чтобы избежать частичного удаления.
  • Рассмотрите возможность архивирования товара вместо удаления, если требуется сохранить историю.

Сравнение подходов: плагин vs кастомный код

МетодПреимуществаНедостатки
ПлагинПростота установки, поддержка, интерфейс
Автоматизация без кода
Может быть избыточным, загружать сайт
Не всегда есть подходящий плагин
Кастомный кодТочная настройка под задачу
Меньше нагрузки на сайт
Требует знаний PHP и WooCommerce
Риск ошибок при некорректной реализации
WooCommerce: как автоматически удалять товар после успешной оплаты без плагинов
22.05.2026
WordPress авторизация по телефону без плагинов: практическое руководство
10.04.2026
Как удалить или изменить атрибуты srcset в WordPress
16.03.2026
WooCommerce: автоматическое отключение товара после продажи
10.06.2026
Как установить лимит на количество регистраций в WordPress
12.02.2026