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

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

Автоматическое удаление товаров после продажи актуально для интернет-магазинов с ограниченным товарным запасом, где каждый товар уникален (например, арт-объекты, хендмейд, коллекционные вещи). Это предотвращает повторные заказы и освобождает каталог от устаревших позиций.

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

Как понять, подходит ли ваш магазин для такого решения

  • Продукты уникальны и не планируются к повторной продаже.
  • Отсутствуют сложные связи товара с другими элементами сайта.
  • Не используется синхронизация с внешними сервисами, которые могут требовать сохранения товаров.

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

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

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

add_action('woocommerce_order_status_completed', 'wps_delete_products_after_sale', 10, 1);
function wps_delete_products_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();
        $product = wc_get_product($product_id);

        // Проверяем, что товар существует и это простой продукт
        if ($product && $product->is_type('simple')) {
            wp_delete_post($product_id, true); // true — удаление без корзины
        }
    }
}

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

  • woocommerce_order_status_completed — хук, вызываемый при смене статуса заказа на «завершён».
  • wc_get_order — получение объекта заказа по ID.
  • Перебираем все позиции заказа, получая ID товара.
  • Удаляем товар напрямую из базы, минуя корзину (без возможности восстановления из админки).

Альтернативы и расширения

  • Удалять не сразу, а переводить в черновики (wp_update_post(['ID' => $product_id, 'post_status' => 'draft'])).
  • Включить проверку мета-поля, чтобы не удалять все товары подряд.
  • Логировать операции удаления для аудита.

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

Чтобы убедиться, что товары удаляются корректно, выполните следующие шаги:

  1. Создайте тестовый заказ с товарами, которые хотите удалить.
  2. Переведите статус заказа в «завершён» через админку WooCommerce.
  3. Проверьте наличие товаров в разделе «Товары» — они должны исчезнуть.
  4. Проверьте базу данных через phpMyAdmin (таблица wp_posts с post_type = 'product'), чтобы убедиться, что записи удалены.
  5. Просмотрите логи ошибок сервера на предмет возможных сбоев.

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

1. Товары не удаляются после смены статуса заказа

  • Проверьте, что хук woocommerce_order_status_completed действительно срабатывает — можно добавить временный error_log.
  • Проверьте права пользователя, под которым запускается PHP, на удаление записей.
  • Убедитесь, что в коде нет синтаксических ошибок.

2. Удаляются не все товары или удаляются лишние

  • Проверьте, что $item->get_product_id() возвращает правильный ID, а не вариации.
  • Добавьте фильтр по типу товара, чтобы исключить вариации или группы.

3. Происходит удаление, но товары отображаются в кэше

  • Очистите кэш сайта и браузера.
  • Если используется плагин кэширования, выполните принудительную очистку.

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

  • Безопасность: Делайте резервные копии базы перед внедрением удаления товаров.
  • Производительность: Не используйте удаление товаров при каждом обновлении заказа — только при смене на конечный статус.
  • Логирование: Записывайте удалённые товары в отдельный лог-файл для возможного восстановления.
  • Проверка типов товаров: Если в магазине есть вариации или сложные типы, уточняйте логику удаления, чтобы не потерять данные.
  • Работа с кэшем: В случае использования Object Cache или CDN — после удаления товара нужно сбрасывать кэш.

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

МетодОписаниеПлюсыМинусы
Прямое удаление в хукеУдаление товаров из базы с помощью wp_delete_postПростота, автоматизация, без плагиновНельзя восстановить, риски удаления неправильных товаров
Перевод в черновикиМеняем статус товара на draftБезопаснее, можно восстановитьТовары остаются в базе, могут отображаться в поиске
Использование плагина для управления товарамиПлагин с расширенными правилами удаленияГибкость, удобствоЗависимость от сторонних решений, нагрузка
WooCommerce: как автоматически удалять заказы после их архивирования
10.05.2026
Как удалить порты в WordPress для блокировки внешних запросов
30.03.2026
Как создать автоматический резервный бэкап WordPress с помощью плагинов и кода
03.01.2026
Автоматическая замена контента в WordPress: практическое решение с использованием WPRemark
15.04.2026
Автоматическое удаление отзывов в WooCommerce после их модерации
22.05.2026