Диагностика проблемы с отменёнными заказами в WooCommerce
В стандартной установке WooCommerce отменённые заказы остаются в статусе "Отменён" до тех пор, пока их не изменят вручную. Это может создавать путаницу в админке и мешать аналитике, особенно если нужен автоматический переход заказа в другой статус или удаление после отмены.
Основные признаки проблемы:
- Отменённые заказы не меняют статус автоматически и остаются в списке заказов.
- Накопление отменённых заказов замедляет работу административной панели.
- Отсутствие автоматической очистки базы от отменённых заказов.
Пошаговое решение: автоматическое изменение статуса отменённого заказа
Шаг 1. Добавление кастомного хука для автоматической обработки
Используем хук woocommerce_order_status_cancelled, который срабатывает при переводе заказа в статус "отменён". Добавим функцию, которая автоматически переведёт заказ в нужный статус или выполнит дополнительные действия.
add_action('woocommerce_order_status_cancelled', 'wp0_auto_update_cancelled_order_status', 10, 1);
function wp0_auto_update_cancelled_order_status($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
// Пример: меняем статус с cancelled на failed
$order->update_status('failed', 'Автоматический перевод заказа из статуса отменён');
}Шаг 2. Автоматическое удаление отменённых заказов через WP-Cron
Если нужно не просто сменить статус, а удалить отменённые заказы через определённое время, создаём WP-Cron задачу:
// Регистрируем событие при активации темы/плагина
if (!wp_next_scheduled('wp0_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wp0_delete_cancelled_orders');
}
// Функция удаления заказов
add_action('wp0_delete_cancelled_orders', 'wp0_delete_old_cancelled_orders');
function wp0_delete_old_cancelled_orders() {
$args = [
'status' => 'cancelled',
'date_modified' => '<' . (time() - 30 * DAY_IN_SECONDS), // старше 30 дней
'limit' => -1
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->delete(true); // удаляем заказ вместе с данными
}
}Проверка результата после внедрения
Для проверки функционала:
- Создайте заказ в WooCommerce и переведите его в статус "Отменён".
- Проверьте, что статус заказа изменился на "failed" (или другой, который вы указали).
- Если настроена WP-Cron задача — подождите день или вызовите событие вручную через
wp cron event run wp0_delete_cancelled_ordersв консоли WP-CLI. - Проверьте, что заказы отменённые старше 30 дней удаляются из базы.
Частые ошибки и как их исправить
- Хук не срабатывает: Проверьте, что функция подключена в файле
functions.phpвашей темы или в отдельном плагине, и что код выполняется. - Заказы не удаляются: Убедитесь, что WP-Cron активен и корректно работает на вашем хостинге. Для проверки можно вызвать событие вручную через WP-CLI.
- Недостаточно прав для удаления: Функция
$order->delete(true)требует прав администратора, убедитесь, что код выполняется с нужными правами. - Не тот статус устанавливается: Проверьте, что передаваемый в
update_status()статус корректен и зарегистрирован в WooCommerce.
Практические советы по безопасности и производительности
- Не удаляйте заказы сразу после отмены — лучше делать это с задержкой (например, 30 дней), чтобы иметь возможность восстановить данные при необходимости.
- Используйте WP-Cron с осторожностью на слабых хостингах — нагрузка может сказаться на производительности. Оптимально запускать задачи вручную или через системный cron.
- Перед массовым удалением заказов сделайте резервную копию базы данных.
- Минимизируйте код в хуках, чтобы не замедлять обработку заказов.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
Смена статуса через woocommerce_order_status_cancelled | Простая реализация, мгновенный эффект | Не удаляет заказы, только меняет статус |
| Удаление заказов через WP-Cron | Автоматическая очистка базы, уменьшение нагрузки | Зависит от cron, риск удаления нужных данных без контроля |
| Ручное удаление | Полный контроль | Трудоёмко и не автоматизировано |