Диагностика задачи
В WooCommerce нередко возникает необходимость автоматически удалять товар из каталога после его продажи. Такая задача актуальна, например, для уникальных или ограниченных в наличии товаров, которые нельзя повторно продавать. Стандартного функционала для этого нет, поэтому нужно добавить кастомный код или использовать подходящие хуки.
Как определить, что товар нужно удалить после продажи
Основной критерий — успешная оплата заказа и смена статуса заказа на "завершён" (completed). В этот момент можно запускать логику удаления товара.
Почему именно статус completed?
- Гарантирует, что оплата прошла.
- Исключает удаление товара при отменённых или возвратных заказах.
Пошаговое решение: удаление товара после смены статуса заказа
Используем хук woocommerce_order_status_completed, который вызывается сразу после смены статуса заказа на completed. В обработчике получаем все товары из заказа и удаляем их.
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 ($product_id) {
// Удаляем товар без возможности восстановления
wp_delete_post($product_id, true);
}
}
}
Объяснение кода
wc_get_order— получает объект заказа.$order->get_items()— получает все позиции товара в заказе.wp_delete_post($product_id, true)— удаляет товар (пост типа product) без перемещения в корзину.
Проверка результата
- Создайте тестовый товар в WooCommerce.
- Оформите тестовый заказ с этим товаром и оплатите его (используйте тестовые платежные методы).
- После смены статуса заказа на "завершён" проверьте, что товар пропал из каталога и из админки (Товары).
- Для дополнительной проверки можно вызвать
get_post_status($product_id)— должен вернутьfalse, если товар удалён.
Частые ошибки и как их исправить
- Товар не удаляется после смены статуса: проверьте, что хук
woocommerce_order_status_completedсрабатывает (можно добавитьerror_logилиvar_dumpвнутри функции). - Удаляется не тот товар: убедитесь, что получаете правильный
product_idчерез$item->get_product_id(), а неvariation_idили другие ID. - Удаление вызывает ошибки сервера: проверьте права на удаление товаров и наличие других плагинов, которые могут блокировать удаление.
- Нужно сохранить товар, если заказ отменён: убедитесь, что функция вызывается именно при статусе
completed, не раньше.
Практические советы по безопасности и производительности
- Добавьте проверку прав пользователя или контекста, если функция запускается из админки или cron, чтобы не удалить товар случайно.
- Если товаров много, добавьте логирование действий удаления для отладки.
- Рассмотрите возможность сначала пометить товар как "скрытый" (
post_status = 'draft'), а потом удалять, чтобы избежать потери данных при ошибках. - Обязательно сделайте резервную копию базы данных перед внедрением кода.
Альтернативы: удаление через плагины или ручное управление
| Метод | Плюсы | Минусы |
|---|---|---|
Кастомный код на хуке woocommerce_order_status_completed | Гибкость, точечное удаление, автоматизация | Требует навыков программирования, риск ошибок |
| Ручное удаление товаров после продажи | Контроль, отсутствие риска сбоев | Затратно по времени, риск забыть |
| Плагины для управления запасами и товарами | Дополнительные функции, удобство | Зависимость от стороннего кода, возможная нагрузка |
Чек-лист для внедрения автоматического удаления товаров
- Создать резервную копию сайта и базы данных.
- Добавить предложенный код в файл
functions.phpвашей темы или в кастомный плагин. - Проверить логику работы на тестовом заказе.
- Убедиться, что товары удаляются только после подтверждённой оплаты (статус
completed). - Настроить логи или уведомления об удалении для контроля.
- Проанализировать влияние на связанные с товаром данные (атрибуты, отзывы и т.д.).