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

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

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

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

Обработка изменения статуса заказа

Для автоматического удаления товара нужно отследить изменение статуса заказа на «завершён» (completed) или «оплачен» (processing) — в зависимости от бизнес-логики.

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

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

function wpchecker_auto_delete_product_after_sale($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 — удаление без корзины
        }
    }
}

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

  • woocommerce_order_status_completed — хук, срабатывающий при смене статуса заказа на завершённый;
  • Получаем объект заказа и перебираем все товары заказа;
  • Удаляем каждый товар с помощью wp_delete_post с параметром true для безвозвратного удаления.

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

  1. Создайте тестовый заказ с уникальным товаром;
  2. Измените статус заказа на «завершён» (можно в админке WooCommerce);
  3. Перейдите в каталог товаров и убедитесь, что товар удалён;
  4. Если товар остался, проверьте логи ошибок PHP и активность кода.

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

  • Товар не удаляется после изменения статуса заказа
    Проверьте, активен ли код и правильно ли подключен. Убедитесь, что статус заказа действительно меняется на completed. Иногда используется processing, если оплата подтверждается сразу.
  • Удаляются товары, которые не нужно удалять
    Если нужно удалять только некоторые товары (например, уникальные), расширьте функцию условием проверки метаданных или категории товара.
  • Удаление вызывает ошибки безопасности
    Убедитесь, что функция вызывается в контексте WordPress, и нет конфликтов с правами доступа.

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

  • Добавьте проверку метаполя, например _unique_item, чтобы удалять только помеченные товары:
if (get_post_meta($product_id, '_unique_item', true) === 'yes') {
    wp_delete_post($product_id, true);
}
  • Резервное копирование базы данных перед внедрением функций удаления обязательно;
  • Для массовых заказов с несколькими товарами продумайте логику: возможно, удалять только первый товар или только уникальные позиции;
  • Для производительности лучше избегать удаления через AJAX на фронтенде — делайте это на серверной стороне во время смены статуса.

Альтернативные способы удаления товаров

СпособПлюсыМинусыРекомендации
Удаление через хук заказа (код) Автоматизация, точечное удаление Риск случайного удаления, требует тестирования Использовать для уникальных товаров
Ручное удаление в админке Контроль, минимальный риск Затратно по времени Подходит для небольших магазинов
Плагин для управления ограниченными товарами Дополнительные функции, удобство Зависимость от сторонних разработчиков, нагрузка Использовать для сложных сценариев
Как удалить пустые и неиспользуемые термины в WordPress
08.02.2026
Как отладить проблемы с PHP в WordPress с помощью Xdebug
19.01.2026
WooCommerce: как автоматически удалить товар после продажи
27.07.2026
WooCommerce: не отображается изображение товара в корзине — как исправить
17.07.2026
Как отключить XML-RPC в WordPress для повышения безопасности
15.03.2026