Диагностика проблемы: зачем автоматизировать удаление товаров после отмены заказа
В стандартной работе WooCommerce отмена заказа не влияет на наличие товаров в каталоге. Однако в ряде кейсов (например, при продаже ограниченных по количеству или единичных продуктов) необходимо удалять товар из каталога сразу после отмены заказа, чтобы избежать ошибок в учете и показать актуальное наличие. Это особенно актуально при ручном добавлении товаров или кастомных типах товаров.
Пошаговое решение: как настроить автоматическое удаление товаров при отмене заказа
1. Подключение к хуку отмены заказа Woocommerce
WooCommerce предоставляет несколько хуков для отслеживания статуса заказа. Для нашей задачи подходит woocommerce_order_status_cancelled - он срабатывает при смене статуса заказа на "отменен".
2. Получение товаров из заказа
Нужно получить все товары из отмененного заказа, чтобы затем удалить соответствующие товары из базы.
3. Удаление товаров программно
Удаление товара происходит через функцию wp_delete_post(), поскольку товар в WooCommerce — это кастомный тип записи (product).
add_action('woocommerce_order_status_cancelled', 'delete_products_after_order_cancelled', 10, 1);
function 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) {
// Проверьте, что это именно товар, а не вариация
$product_post_type = get_post_type($product_id);
if ($product_post_type === 'product') {
// Удаляем товар без возможности восстановления
wp_delete_post($product_id, true);
}
}
}
}Проверка результата после внедрения
Для проверки сделайте следующее:
- Создайте тестовый заказ с одним или несколькими товарами.
- Переведите заказ в статус "Отменен" через админку WooCommerce.
- Проверьте, что соответствующие товары исчезли из каталога и базы данных (например, через админ-панель или запрос к базе
SELECT * FROM wp_posts WHERE ID = {product_id}).
Если товары не удаляются, проверьте логи ошибок PHP и убедитесь, что функция delete_products_after_order_cancelled вызывается.
Частые ошибки и как их исправить
- Товары не удаляются: возможно, хук не срабатывает. Проверьте, что статус действительно меняется на 'cancelled', а не на 'refunded' или другой.
- Удаляются вариации вместо основных товаров: функция пытается удалить вариации, которые могут быть связаны с другими основными товарами. В коде выше предусмотрена проверка типа записи — не удаляйте вариации, если не уверены.
- Ошибка прав доступа: функция
wp_delete_postтребует прав администратора. Убедитесь, что код выполняется в контексте с достаточными правами. - Потеря данных: удаление товара — необратимая операция. Рекомендуется делать резервные копии перед внедрением.
Практические советы по безопасности и производительности
- Добавьте проверку nonce или используйте capability проверки, если планируете расширять функционал для фронтенда.
- Если товаров много, подумайте о реализации пакетного удаления через очереди, чтобы не перегружать сервер.
- Для резервного копирования можно интегрировать Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbegin.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskaya-udaleniya-tovarov-posle-otmeny-zakaza) — он поможет автоматизировать чистку базы и создание бэкапов.
Таблица сравнения вариантов удаления товаров после отмены заказа
| Способ | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоемко, риск ошибки |
Автоматический код на хуке woocommerce_order_status_cancelled | Полная автоматизация, быстрое удаление | Риск случайного удаления, требует тестирования |
| Плагин для управления запасами | Дополнительный функционал учета | Может быть избыточным, нагрузка на сайт |