Диагностика проблемы: зачем удалять товары после отмены заказа
В стандартном WooCommerce отмена заказа не влияет на наличие товаров в каталоге. Однако в некоторых сценариях, например при продаже эксклюзивных или ограниченных по количеству товаров, необходимо автоматически удалять товар из базы после отмены, чтобы избежать ошибок учета и путаницы.
Чаще всего пользователи сталкиваются с задачей убрать товар, если заказ отменён и товар больше не должен отображаться в магазине. Без автоматизации это требует ручного контроля, что неудобно и ошибочно.
Как проверить, что товар не удаляется после отмены заказа
- Перейдите в WooCommerce → Заказы, найдите заказ со статусом "Отменён".
- Откройте его и запомните ID товара, который в заказе.
- Перейдите в товары WooCommerce и проверьте наличие этого товара.
- Если товар есть, значит автоматического удаления нет.
Пошаговое решение: автоматическое удаление товара после отмены заказа
Подключение к хуку смены статуса заказа
WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при смене статуса заказа. Используем его для проверки, когда заказ переходит в статус cancelled.
Пример кода для functions.php темы или кастомного плагина
add_action('woocommerce_order_status_changed', 'auto_delete_product_on_order_cancelled', 10, 4);
function auto_delete_product_on_order_cancelled($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return;
}
// Получаем все позиции заказа
foreach ($order->get_items() as $item_id => $item) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
if ($product) {
// Проверяем, не является ли товар важным (например, проверка по мета)
$protected = get_post_meta($product_id, '_protected_from_auto_delete', true);
if ($protected) {
continue; // пропускаем защищённые товары
}
// Удаляем товар (без перемещения в корзину)
wp_delete_post($product_id, true);
}
}
}Объяснение кода
- Функция срабатывает при смене статуса заказа на
cancelled. - Перебирает все товары в заказе и получает их ID.
- Проверяет наличие мета-ключа
_protected_from_auto_deleteдля исключения важных товаров. - Удаляет товар с помощью
wp_delete_postс параметромtrue, чтобы миновать корзину.
Как проверить результат после внедрения
- Создайте тестовый заказ с одним или несколькими товарами.
- Отмените заказ через админку WooCommerce.
- Перейдите в раздел «Товары» и убедитесь, что товар(ы) из отменённого заказа удалены.
- Если товар защищён мета-ключом, он останется в базе.
Частые ошибки и как их исправить
Товар не удаляется после отмены заказа
- Хук не подключен или приоритет слишком низкий — увеличьте приоритет в
add_action. - Функция не вызывается из-за ошибки синтаксиса — проверьте логи PHP.
- Товары защищены от удаления — проверьте мета-ключ
_protected_from_auto_delete.
Удаляются не те товары или лишние
- Убедитесь, что в заказе нет товаров с вариациями, которые требуют отдельной обработки.
- Добавьте логирование для отладки, например
error_log('Deleting product ID: '.$product_id);.
Ошибки прав доступа
- Проверьте, что пользователь, от имени которого выполняется скрипт, имеет права на удаление товаров.
Практические советы по безопасности и производительности
- Не удаляйте товары без проверки — используйте мета-ключи или категории для исключения важных товаров.
- Для массовых заказов с большим количеством товаров добавьте ограничение на количество удаляемых товаров за один вызов, чтобы избежать тайм-аутов.
- Резервное копирование базы перед внедрением автоматического удаления — обязательная мера.
- Логируйте действия удаления товаров для последующего аудита.
Альтернативные подходы: удаление через плагин или код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление товаров | Простота, контроль | Трудоемко, риск ошибок |
| Автоматическое удаление через код (как выше) | Полный контроль, кастомизация | Требует навыков, возможны ошибки |
| Плагин для управления товарами и заказами | Удобство интерфейса, поддержка | Может быть избыточным, нагрузка на сайт |