Диагностика задачи: зачем удалять товары после отмены заказа
В стандартном WooCommerce товары остаются в каталоге независимо от статуса заказов. Иногда требуется автоматически удалять товары, если заказ отменён или возвращён, например, для ограниченных серий или эксклюзивных предложений. Это не встроенная функция WooCommerce, поэтому необходимо реализовать кастомное решение.
Пошаговое решение: удаление товаров после смены статуса заказа на «Отменён»
1. Использование хука смены статуса заказа
Для отслеживания изменения статуса заказа используем хук woocommerce_order_status_changed. На событие смены статуса проверим новый статус и удалим товары из заказа, если он отменён.
2. Пример кода для functions.php или плагина
add_action('woocommerce_order_status_changed', 'wc_auto_delete_products_on_cancel', 10, 4);
function wc_auto_delete_products_on_cancel($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return; // Удаляем только при смене на отменён
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if (get_post_type($product_id) === 'product') {
// Удаляем продукт полностью
wp_delete_post($product_id, true);
}
}
}
3. Как внедрить
- Добавьте этот код в файл functions.php вашей дочерней темы или создайте небольшой плагин.
- Проверьте, что у вас есть резервные копии сайта и базы данных перед удалением продуктов.
- Обновите статус нескольких тестовых заказов в WooCommerce на «Отменён» и проверьте удаление товаров.
Проверка результата после внедрения
Для проверки выполните следующие шаги:
- Создайте тестовый заказ с несколькими товарами.
- Смените статус заказа на «Отменён» в админке WooCommerce.
- Перейдите в каталог товаров и убедитесь, что товары из отменённого заказа удалены.
- Проверьте, что другие товары остались нетронутыми.
Частые ошибки и как их исправить
- Товары не удаляются: Проверьте правильность подключения функции и нет ли ошибок PHP в журнале. Убедитесь, что статус заказа действительно меняется на
cancelled. - Удаляются не те товары: Убедитесь, что функция получает правильный
product_idи что проверка типа постаget_post_type($product_id) === 'product'срабатывает. - Нарушение логики бизнеса: Удаление товара из каталога необратимо. Для избежания потерь лучше сначала ставить товар в черновик или архивировать.
Советы по безопасности и производительности
- Всегда делайте резервные копии перед массовыми изменениями.
- Если товаров много, реализуйте удаление через WP-Cron для снижения нагрузки.
- Рассмотрите альтернативу — перевод товара в статус «черновик» вместо удаления для возможности восстановления.
- Ограничьте удаление товаров только для определённых категорий или меток, чтобы избежать случайного удаления.
Дополнительный пример: перевод товара в черновик вместо удаления
add_action('woocommerce_order_status_changed', 'wc_auto_draft_products_on_cancel', 10, 4);
function wc_auto_draft_products_on_cancel($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return;
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if (get_post_type($product_id) === 'product') {
// Переводим товар в черновик
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft'
));
}
}
}
Таблица сравнения подходов удаления товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Удаление через wp_delete_post | Полное удаление товара из базы данных | Освобождает место, исключает повторное использование | Невозможно восстановить, риск потери данных |
| Перевод в статус "черновик" | Товар скрыт в каталоге, но сохраняется в базе | Можно быстро восстановить, безопаснее | Не освобождает место, товар всё еще в базе |