Диагностика проблемы: почему товары остаются в отменённых заказах
При отмене заказа в WooCommerce по умолчанию товары остаются в записи заказа, что может приводить к путанице при отчётах и аналитике. Особенно это критично для магазинов с учётом остатков или автоматизацией обработки заказов.
Чтобы убедиться, что товары не удаляются, нужно проверить статус заказа и содержимое заказанных позиций в админке WooCommerce.
Пошаговое решение: автоматическое удаление товаров из отменённого заказа
1. Использование хука woocommerce_order_status_cancelled
WooCommerce предоставляет хук для обработки смены статуса заказа. Мы можем привязаться к событию смены статуса на cancelled и удалить товары из заказа.
2. Пример кода для functions.php вашей темы или плагина
add_action('woocommerce_order_status_cancelled', 'wpcompany_remove_items_from_cancelled_order');
function wpcompany_remove_items_from_cancelled_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Удаляем все позиции заказа
foreach ($order->get_items() as $item_id => $item) {
$order->remove_item($item_id);
}
// Обновляем заказ в базе
$order->calculate_totals(false);
$order->save();
}
Этот код удалит все товары из заказа сразу после его отмены.
3. Альтернативный подход: удаление товаров при смене любого статуса на «отменён»
add_action('woocommerce_order_status_changed', 'wpcompany_remove_items_on_status_cancelled', 10, 4);
function wpcompany_remove_items_on_status_cancelled($order_id, $old_status, $new_status, $order) {
if ($new_status === 'cancelled') {
foreach ($order->get_items() as $item_id => $item) {
$order->remove_item($item_id);
}
$order->calculate_totals(false);
$order->save();
}
}
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce с несколькими товарами.
- Отмените заказ через админку или фронтенд.
- Перейдите в редактирование заказа и убедитесь, что список товаров пуст.
- Проверьте, что сумма заказа обновлена и равна 0.
Частые ошибки и как их исправить
- Код не срабатывает при отмене заказа: Проверьте, правильно ли вы добавили код и активна ли тема/плагин с ним. Убедитесь, что статус отмены именно
cancelled, а не похожий (например,refunded). - Удаление товаров не обновляет сумму заказа: Обязательно вызывайте
calculate_totals(false)иsave()после удаления позиций. - Конфликт с другими плагинами: Некоторые плагины могут переопределять логику работы со статусами заказа. Проверьте совместимость, отключая другие плагины.
Практические советы по безопасности и производительности
- Используйте проверку наличия ID заказа и объекта
WC_Orderперед выполнением операций. - Не выполняйте тяжёлых операций в хук, чтобы не замедлять обработку смены статуса.
- Для больших магазинов с большим количеством заказов рассмотрите логику удаления товаров через фоновые задачи (cron) для минимизации нагрузки.
- Регулярно делайте резервное копирование базы данных перед внесением изменений.
Сравнение вариантов удаления товаров из отменённых заказов
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
Хук woocommerce_order_status_cancelled |
Простая реализация, срабатывает сразу | Не учитывает другие способы отмены | В статье |
Хук woocommerce_order_status_changed с проверкой статуса |
Гибко реагирует на смену статуса | Нужно внимательно фильтровать статусы | В статье |
| Ручное удаление через админку | Без кода, контролируемо | Трудоёмко, риск ошибок | Нет |