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