Диагностика задачи: зачем удалять товары после отмены заказа в WooCommerce
В стандартной логике WooCommerce отмена заказа не влияет на наличие товара в каталоге. Однако в некоторых бизнес-сценариях, например, при продаже уникальных или лимитированных товаров, требуется автоматически удалять товар из базы после отмены заказа, чтобы исключить повторную продажу или освободить место для новых позиций.
Перед реализацией важно убедиться, что именно отмена заказа должна быть триггером удаления товара, и что удаление будет безопасным с точки зрения целостности данных.
Как отследить отмену заказа и автоматически удалить товар: пошаговое решение
1. Подписка на хук изменения статуса заказа
WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при смене статуса заказа. Используем его для проверки перехода в статус cancelled.
2. Получение товаров из отмененного заказа
Далее получаем все товары (товарные позиции) из заказа, чтобы знать, какие продукты необходимо удалить.
3. Удаление товаров программно
Удаляем товары с помощью функции wp_delete_post(). Важно использовать параметр $force_delete = true, чтобы миновать корзину и полностью удалить запись.
4. Добавление кода в functions.php или в кастомный плагин
add_action('woocommerce_order_status_changed', 'wp5_delete_products_after_order_cancel', 10, 4);
function wp5_delete_products_after_order_cancel($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return;
}
if (!$order instanceof WC_Order) {
$order = wc_get_order($order_id);
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if ($product_id) {
// Безопасная проверка перед удалением
$product_post = get_post($product_id);
if ($product_post && $product_post->post_type === 'product') {
// Удаляем товар полностью, минуя корзину
wp_delete_post($product_id, true);
}
}
}
}
Проверка результата после внедрения
- Создайте тестовый заказ с одним или несколькими товарами.
- Перейдите в админку WooCommerce, смените статус заказа на
cancelled. - Проверьте в разделе «Товары», что указанные в заказе товары удалены.
- Проверьте, нет ли ошибок в логах PHP или WooCommerce.
Если товары удалены корректно, значит решение работает.
Частые ошибки и как их исправить
- Товары не удаляются: возможно, хук не срабатывает. Проверьте, что функция добавлена правильно и что статус действительно меняется на
cancelled. - Удаляются не те товары: убедитесь, что вы используете
$item->get_product_id(), а не$item->get_variation_id(), если хотите удалить основные товары, а не вариации. - Ошибка доступа: функция
wp_delete_post()требует прав администратора. Убедитесь, что код выполняется в контексте, где есть нужные права. - Нарушение целостности данных: если товар используется в других заказах, его удаление может привести к проблемам. Рекомендуется проверять количество заказов с товаром перед удалением.
Практические советы по безопасности и производительности
- Перед удалением товара проверьте, что он не используется в других активных заказах. Для этого можно использовать WP_Query с мета-запросом по заказам.
- Сделайте резервную копию базы перед внедрением автоматического удаления.
- Логируйте действия удаления в отдельный файл для аудита.
- Если товары — вариации, учитывайте логику удаления родительских товаров и вариаций.
- Рассмотрите альтернативу: не удалять товар, а переключать его статус на «черновик» или «скрытый» для сохранения истории.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Автоматическое удаление товаров через хук | Полное удаление, освобождение базы, автоматизация | Риск потери данных, возможные ошибки при повторном использовании товара |
| Перевод товаров в статус «черновик» или «скрытый» | Сохраняется история, безопаснее для данных | Товары остаются в базе, возможен рост базы |
| Ручное удаление после уведомления | Контроль и проверка перед удалением | Требует времени, не автоматизировано |