Диагностика задачи: зачем и когда нужно удалять товар после покупки
В стандартных настройках WooCommerce товар после продажи остаётся в каталоге, что логично для большинства магазинов. Однако бывают сценарии, когда товар является уникальным, одноразовым или ограниченным по количеству, и после покупки его нужно автоматически убрать из каталога, чтобы избежать повторных заказов и ошибок.
Пример: магазин уникальных арт-объектов, цифровых лицензий с ограниченным доступом или разовых услуг. Решение нужно реализовать именно на уровне WooCommerce, без ручного удаления.
Как проверить, что ваш товар требует удаления после покупки
- Товар не имеет вариаций или опций, т.к. удаление вариаций требует особой обработки.
- Количество товара ограничено (обычно 1).
- Товар не используется в других заказах или корзинах.
Если эти условия выполняются, автоматизация удаления будет полезна.
Пошаговое решение: автоматическое удаление товара после успешного заказа
1. Используем хук woocommerce_order_status_completed
Этот хук срабатывает, когда заказ переводится в статус «завершён». Здесь можно получить все товары заказа и удалить их с сайта.
2. Код для удаления товаров
add_action('woocommerce_order_status_completed', 'wpid_woocommerce_remove_products_after_purchase', 10, 1);
function wpid_woocommerce_remove_products_after_purchase($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 (get_post_status($product_id) !== false) {
// Удаляем товар без возможности восстановления
wp_delete_post($product_id, true);
}
}
}
Этот код полностью удаляет пост товара из базы, включая все его данные.
3. Дополнительные условия удаления
Если нужно удалять только товары с определённым статусом или мета, добавьте проверку:
// Например, удаляем только товары с мета 'is_unique' = 'yes'
if (get_post_meta($product_id, 'is_unique', true) === 'yes') {
wp_delete_post($product_id, true);
}
Проверка результата после внедрения
- Создайте тестовый заказ с уникальным товаром.
- Переведите заказ в статус «завершён» (manual или автоматический переход).
- Проверьте, исчез ли товар из каталога и из списка товаров в админке.
- Убедитесь, что при попытке добавить товар в корзину после удаления выдаётся ошибка.
Частые ошибки и как их исправить
- Товар не удаляется после смены статуса: проверьте, что хук подключён и функция вызывается. Для отладки можно добавить
error_logвнутри функции. - Удаление товара удаляет связанные данные, но отзывы и заказы остаются: это нормальное поведение, заказы сохраняются в истории.
- Товар отображается в кэше после удаления: очистите кеш плагинов и браузера.
- Удаление происходит слишком рано, товар нужен для других заказов: добавьте логику проверки количества заказов с этим товаром до удаления.
Практические советы по безопасности и производительности
- Удаление товара — необратимая операция с параметром
wp_delete_post($id, true). Для безопасности можно сначала переводить товар в статус «черновик» или «скрытый» и удалять вручную. - При большом количестве товаров в заказе используйте транзакции или очереди, чтобы не создавать нагрузку.
- Добавляйте резервное копирование базы данных перед внедрением автоматического удаления.
- Для удобства помечайте товары, которые нужно удалять, мета-полем, чтобы избежать случайных удалений.
Сравнение подходов: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоёмко, риск забыть |
| Плагин автоматического удаления | Удобство, настройки | Зависимость от стороннего кода, нагрузка |
| Код в functions.php (пример выше) | Лёгкая кастомизация, отсутствие сторонних зависимостей | Требует навыков, риск ошибок при неправильной логике |