Диагностика проблемы: зачем автоматически удалять товар после отмены заказа
В стандартном WooCommerce отмена заказа не влияет на наличие или удаление товара в каталоге. Однако бывают кейсы, когда магазину нужно автоматически удалять товар из базы при отмене заказа — например, если товар уникален, ограничен по количеству или выпускается под заказ и не должен оставаться в каталоге после отмены.
Основные признаки необходимости такого решения:
- Товар создаётся автоматически в момент оформления заказа.
- Отмена заказа означает, что товар больше не нужен и должен быть удалён.
- Нельзя оставлять «мертвые» товары, чтобы не вводить покупателей в заблуждение.
Как отследить отмену заказа и удалить связанный товар в WooCommerce
Для автоматизации процесса потребуется использовать хук woocommerce_order_status_cancelled — он срабатывает при смене статуса заказа на «Отменён». При этом нужно получить все товары из заказа и удалить те, которые должны исчезнуть.
Ниже — пример кода, который удаляет продукты, связанные с отменённым заказом:
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) continue;
// Здесь можно добавить условие, чтобы удалять только нужные товары
// Например, по категории или тегу
$product = wc_get_product($product_id);
if ($product && has_term('unique-products', 'product_cat', $product_id)) {
wp_delete_post($product_id, true); // true — принудительное удаление без корзины
}
}
}Объяснение кода
- Хук
woocommerce_order_status_cancelledзапускает функцию после смены статуса заказа. - Перебираются все позиции заказа, извлекается ID товара.
- Проверяется, что товар принадлежит категории
unique-products— замените на свою категорию по необходимости. - Удаляется товар из базы данных с помощью
wp_delete_postс флагомtrueдля окончательного удаления.
Пошаговое внедрение решения
- Подключитесь к сайту через FTP или используйте редактор тем (желательно дочерняя тема или плагин для кастомного кода).
- Добавьте приведённый выше код в файл
functions.phpвашей дочерней темы или создайте собственный плагин. - Замените условие
has_term('unique-products', 'product_cat', $product_id)на вашу логику фильтрации товаров для удаления (если необходимо). - Сохраните изменения и очистите кеш сайта, если используется кеширование.
- Создайте тестовый заказ с товаром из нужной категории и отмените его через админ-панель WooCommerce.
Как проверить, что решение работает
- Создайте заказ с товаром, который должен удаляться после отмены.
- Перейдите в админку WooCommerce, измените статус заказа на «Отменён».
- Перейдите в каталог товаров и убедитесь, что товар исчез.
- Проверьте базу данных (таблица
wp_posts) — товара с данным ID больше нет.
Частые ошибки и как их исправить
- Товар не удаляется: проверьте, что хук подключён и код не вызывает ошибок. Включите режим отладки WordPress (
WP_DEBUG). - Удаляются все товары, а не только нужные: добавьте фильтрацию товаров по категории, тегу или метаполям, чтобы удалить только целевые позиции.
- Ошибка прав доступа: убедитесь, что пользователь с правами администратора выполняет действия, а функция удаления вызывается на сервере.
- Удаление не окончательное: параметр
trueвwp_delete_postгарантирует полное удаление без помещения в корзину.
Практические советы по безопасности и производительности
- Не удаляйте товары массово без проверки, какие именно нужно удалить — это может привести к потере важных данных.
- Добавляйте логирование действий удаления через
error_logили собственные таблицы для отладки. - Используйте условия, чтобы не нагружать систему лишними запросами.
- Если товары связаны с другими постами (например, ревью, галереями), учитывайте это при удалении.
Альтернативные варианты: сравнение методов удаления товара после отмены заказа
| Метод | Плюсы | Минусы |
|---|---|---|
Удаление в хуке woocommerce_order_status_cancelled | Автоматизация, гибкость фильтрации | Нужен код, риск удаления нужных товаров без фильтрации |
| Ручное удаление товаров после отмены | Полный контроль, минимальный риск ошибок | Трудозатратно, не автоматизировано |
| Использование сторонних плагинов для автоматизации | Простота внедрения | Может быть избыточно, нет гибкости, нагрузка на сайт |