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

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

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

Диагностика задачи

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

Какие хуки подходят для отслеживания успешной оплаты?

  • woocommerce_order_status_completed — вызывается при смене статуса на "completed"
  • woocommerce_payment_complete — вызывается сразу после оплаты, но до смены статуса

Для надежности используем woocommerce_order_status_completed, так как это финальная точка, когда заказ полностью обработан.

Пошаговое решение

Ниже пример кода, который удаляет все товары из заказа после смены его статуса на "completed".

add_action('woocommerce_order_status_completed', 'wpmart_remove_products_after_payment', 10, 1);
function wpmart_remove_products_after_payment($order_id) {
    if (!$order_id) return;
    $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); // true — без возможности восстановления
        }
    }
}

Этот код удалит все продукты, входящие в заказ, сразу после того, как заказ сменит статус на "completed".

Объяснение кода

  • Хук woocommerce_order_status_completed передает ID заказа
  • Получаем объект заказа через wc_get_order()
  • Перебираем все товары заказа $order->get_items()
  • Извлекаем ID товара и удаляем его через wp_delete_post() с параметром true для полного удаления

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

  1. Создайте тестовый продукт и добавьте его в корзину
  2. Оформите заказ и переведите статус заказа вручную в панеле администратора в "Completed" или оплатите тестовой оплатой
  3. После смены статуса проверьте, что товар удалился из списка продуктов (Товары → Все товары)
  4. Если товар исчез — решение работает
  5. Для дополнительной проверки можно посмотреть в базе данных wp_posts, что запись о товаре удалена

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

  • Товар не удаляется после оплаты: проверьте, что хук действительно срабатывает. Добавьте error_log('Order completed: '.$order_id); внутри функции и проверьте логи.
  • Удаляется не тот товар или несколько раз: убедитесь, что вы используете $item->get_product_id(), а не $item->get_variation_id() (если у вас вариации, возможно, нужна дополнительная логика)
  • Удаляется товар, который не нужно удалять: добавьте дополнительные проверки, например, по категории или метаполям, чтобы удалять только определенные товары
  • Ошибка при удалении товара: проверьте права пользователя, от имени которого выполняется код, и что товар действительно существует

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

  • Удаление товаров — необратимая операция. Рекомендуется делать резервные копии базы данных перед внедрением такого функционала.
  • Если у вас большой магазин, удаление большого количества товаров одновременно может вызвать нагрузку. Можно реализовать очередь на удаление через WP Cron.
  • Для избирательного удаления добавьте проверку по метаполям, категориям или тегам, например:
if (has_term('unique', 'product_cat', $product_id)) {
    wp_delete_post($product_id, true);
}
  • Для логирования и отладки используйте error_log() или плагины для мониторинга хуков.
  • Если вы используете кастомные типы продуктов, проверьте, что удаление не ломает связи с заказами и отчетами.

Сравнение методов удаления товара после оплаты

МетодРеализацияПлюсыМинусы
Код в functions.phpХук woocommerce_order_status_completed + wp_delete_post()Быстро, без плагинов, гибкоНужна аккуратность, риск удаления лишнего
ПлагинПлагины для управления товарами после оплатыПростота, готовые настройкиНагрузка, зависимости, может быть платным
Ручная очисткаУдаление товара вручную после оплатыБезопасно, контрольТрудоемко, не автоматично
Как удалить или изменить атрибуты img в WordPress без плагинов
19.02.2026
WooCommerce: как автоматически отключать товар после продажи
18.05.2026
Как удалить или изменить атрибуты srcset в WordPress
16.03.2026
WooCommerce: автоматическое отключение товара после продажи
10.06.2026
Автоматический импорт товаров в WooCommerce: настройка и примеры
19.03.2026