Диагностика задачи: зачем и когда нужно удалять товары после продажи
Автоматическое удаление товаров после продажи актуально для интернет-магазинов с ограниченным товарным запасом, где каждый товар уникален (например, арт-объекты, хендмейд, коллекционные вещи). Это предотвращает повторные заказы и освобождает каталог от устаревших позиций.
Перед внедрением решения необходимо проверить, что товары действительно одноразовые и не используются в других местах сайта (категории, связанные товары, акции). Также важно понимать, что удаление товара – необратимая операция, поэтому стоит предусмотреть резервное копирование.
Как понять, подходит ли ваш магазин для такого решения
- Продукты уникальны и не планируются к повторной продаже.
- Отсутствуют сложные связи товара с другими элементами сайта.
- Не используется синхронизация с внешними сервисами, которые могут требовать сохранения товаров.
Пошаговое решение: автоматическое удаление товара после подтверждения заказа
Для реализации воспользуемся хуком 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'])). - Включить проверку мета-поля, чтобы не удалять все товары подряд.
- Логировать операции удаления для аудита.
Проверка результата после внедрения
Чтобы убедиться, что товары удаляются корректно, выполните следующие шаги:
- Создайте тестовый заказ с товарами, которые хотите удалить.
- Переведите статус заказа в «завершён» через админку WooCommerce.
- Проверьте наличие товаров в разделе «Товары» — они должны исчезнуть.
- Проверьте базу данных через phpMyAdmin (таблица wp_posts с post_type = 'product'), чтобы убедиться, что записи удалены.
- Просмотрите логи ошибок сервера на предмет возможных сбоев.
Частые ошибки и как их исправить
1. Товары не удаляются после смены статуса заказа
- Проверьте, что хук
woocommerce_order_status_completedдействительно срабатывает — можно добавить временныйerror_log. - Проверьте права пользователя, под которым запускается PHP, на удаление записей.
- Убедитесь, что в коде нет синтаксических ошибок.
2. Удаляются не все товары или удаляются лишние
- Проверьте, что
$item->get_product_id()возвращает правильный ID, а не вариации. - Добавьте фильтр по типу товара, чтобы исключить вариации или группы.
3. Происходит удаление, но товары отображаются в кэше
- Очистите кэш сайта и браузера.
- Если используется плагин кэширования, выполните принудительную очистку.
Практические советы по безопасности и производительности
- Безопасность: Делайте резервные копии базы перед внедрением удаления товаров.
- Производительность: Не используйте удаление товаров при каждом обновлении заказа — только при смене на конечный статус.
- Логирование: Записывайте удалённые товары в отдельный лог-файл для возможного восстановления.
- Проверка типов товаров: Если в магазине есть вариации или сложные типы, уточняйте логику удаления, чтобы не потерять данные.
- Работа с кэшем: В случае использования Object Cache или CDN — после удаления товара нужно сбрасывать кэш.
Сравнение методов удаления товаров после продажи
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Прямое удаление в хуке | Удаление товаров из базы с помощью wp_delete_post | Простота, автоматизация, без плагинов | Нельзя восстановить, риски удаления неправильных товаров |
| Перевод в черновики | Меняем статус товара на draft | Безопаснее, можно восстановить | Товары остаются в базе, могут отображаться в поиске |
| Использование плагина для управления товарами | Плагин с расширенными правилами удаления | Гибкость, удобство | Зависимость от сторонних решений, нагрузка |