Диагностика проблемы: зачем и когда нужно удалять товары после отмены заказа
В WooCommerce стандартно товары не удаляются автоматически при отмене заказов. Иногда это требуется для магазинов с ограниченным запасом или для временных товаров, которые должны быть недоступны после отмены покупки. Без автоматизации приходится делать это вручную, что неудобно и чревато ошибками.
Проверяем, что происходит с товарами при отмене заказа:
- Статус заказа меняется на «Отменен»;
- Товары остаются в каталоге;
- Если товар уникальный и не должен возвращаться в продажу, его нужно удалить вручную.
Если у вас такая ситуация — пора автоматизировать процесс.
Пошаговое решение: автоматическое удаление товаров после смены статуса заказа на «Отменен»
1. Добавляем пользовательский код в functions.php вашей темы или в отдельный плагин
Используем хук woocommerce_order_status_cancelled, который срабатывает при смене статуса заказа на «Отменен».
add_action('woocommerce_order_status_cancelled', 'auto_delete_products_after_order_cancelled', 10, 1);
function auto_delete_products_after_order_cancelled($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) continue;
// Удаляем товар без возможности восстановления
wp_delete_post($product_id, true);
}
}
2. Как работает код
- При смене статуса заказа на «Отменен» вызывается функция
auto_delete_products_after_order_cancelled. - Функция получает объект заказа и перебирает все позиции в заказе.
- Для каждого товара вызывается
wp_delete_postс параметромtrue— это полное удаление без помещения в корзину.
Проверка результата
Чтобы убедиться, что всё работает, сделайте следующее:
- Создайте тестовый заказ с одним или несколькими товарами.
- Перейдите в админку WooCommerce и смените статус заказа на «Отменен».
- Проверьте в разделе «Товары» — удалён ли товар из каталога.
- Если товар удалён, значит автоматизация сработала.
Частые ошибки и как их исправлять
1. Товары не удаляются после отмены заказа
- Проверьте, что хук
woocommerce_order_status_cancelledдействительно срабатывает. Можно добавитьerror_logв функцию для отладки. - Убедитесь, что вы используете правильный ID товара
$item->get_product_id(), а не вариации$item->get_variation_id(). Если нужны вариации, нужно их тоже удалять отдельно.
2. Удаляется не тот товар или удаление происходит для всех товаров на сайте
- Проверьте, что функция вызывается только для конкретного заказа — используйте параметр
$order_idи не запускайте код вне хука. - Не используйте глобальные переменные вне функции.
3. Ошибки доступа или недостаточно прав
- Код выполняется с правами пользователя, под которым работает сайт. Для удаления товаров требуется права администратора.
- Если сайт на хостинге с ограничениями, убедитесь, что PHP-процессы могут удалять записи из базы.
Практические советы по безопасности и производительности
- Удаление товаров — операция необратимая с параметром
wp_delete_post(..., true). Убедитесь, что вы хотите полностью удалить товар, а не просто скрыть его. - Если требуется восстановление, используйте
wp_trash_postвместо удаления. - Для массовых заказов с большим количеством товаров можно добавить лимиты или очередь, чтобы не перегружать сервер.
- Рекомендуется делать бэкап базы данных перед внедрением автоматического удаления.
Дополнительные варианты и сравнение
Варианты реализации автоматического удаления товаров после отмены заказа:
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Прямое удаление через хук WooCommerce | Быстро, не требует плагинов | Риск ошибок, требует контроля |
| Плагин автоматизации | Готовые плагины для автоматических действий | Удобно, поддержка | Зависимость от стороннего кода, нагрузка |
| Ручное удаление | Админка WooCommerce | Просто | Трудозатратно, риск ошибок |