Диагностика задачи: зачем и когда нужно удалять товары после отмены заказа
В стандартном WooCommerce товары, добавленные в магазин, не удаляются автоматически после отмены заказов. Однако в некоторых сценариях, например при продаже уникальных или ограниченных продуктов, важно освобождать товарные позиции сразу после отмены заказа, чтобы избежать ошибок в учете и перепродажи.
Основная проблема: отмененный заказ не освобождает товар из резерва, и администратору приходится вручную удалять или деактивировать товар. Автоматизация этого процесса экономит время и снижает риск ошибок.
Пошаговое решение: реализация автоматического удаления товаров после отмены заказа
1. Используем хук для отслеживания смены статуса заказа
WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при изменении статуса заказа. Нам нужно ловить переход в статус cancelled.
2. Получаем товары из отмененного заказа и удаляем их
Код ниже удаляет все товары, которые были в отмененном заказе. Обратите внимание, что удаление товаров — операция необратимая, поэтому применяйте с осторожностью или делайте резервную копию.
add_action('woocommerce_order_status_changed', 'auto_delete_products_after_cancel', 10, 4);
function auto_delete_products_after_cancel($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return;
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if ($product_id) {
wp_delete_post($product_id, true); // true - удалить навсегда
}
}
}3. Добавляем проверку на тип товара
Если в магазине есть разные типы товаров, но удалять нужно только определённые (например, simple), добавим фильтрацию по типу:
add_action('woocommerce_order_status_changed', 'auto_delete_simple_products_after_cancel', 10, 4);
function auto_delete_simple_products_after_cancel($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return;
}
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && $product->is_type('simple')) {
wp_delete_post($product->get_id(), true);
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ с нужными товарами.
- Отмените заказ в админке WooCommerce.
- Проверьте, что товары из этого заказа удалены в разделе «Товары».
- Убедитесь, что другие товары не затронуты.
При необходимости используйте error_log или дебаггер для отслеживания срабатывания функции.
Частые ошибки и как их исправить
- Товары не удаляются: Проверьте, что хук подключен в functions.php активной темы или в плагине, функция получает правильные параметры, и статус заказа меняется именно на
cancelled. - Удаляются не все нужные товары: Убедитесь, что используете метод
$item->get_product()для получения объекта товара, а не только ID. - Удаление вызывает ошибки: Возможно, товар связан с другими объектами (например, вариации). В этом случае сначала удалите вариации или реализуйте более сложную логику удаления.
- Удаление нежелательных товаров: Добавьте дополнительную проверку по типу товара или по кастомным метаданным, чтобы избежать удаления важных товаров.
Практические советы по безопасности и производительности
- Перед удалением товара всегда делайте резервное копирование базы данных.
- Чтобы избежать случайных удалений, тестируйте код на локальной или staging-среде.
- Если удаление товаров — слишком радикальное решение, рассмотрите вариант изменения статуса товара или установки метки «Продано».
- Для крупных магазинов с большим количеством заказов избегайте тяжелых операций при смене статусов, чтобы не замедлять сайт.
Сравнение подходов: плагин vs. кастомный код
| Критерий | Плагин | Кастомный код | Компромисс |
|---|---|---|---|
| Гибкость | Ограничена функциями плагина | Максимальная, можно адаптировать под любые сценарии | Код с возможностью настройки через фильтры |
| Простота установки | Просто, без навыков программирования | Требует знания PHP и WooCommerce | Минимальный код в child-теме |
| Производительность | Может добавлять нагрузку, зависит от плагина | Оптимально, если код написан грамотно | Оптимизированный кастомный код |
| Поддержка | Плагин обновляется разработчиком | Поддержка только своими силами | Использовать популярные плагины с возможностью кастомизации |