Диагностика проблемы с отменой заказов в WooCommerce
По умолчанию WooCommerce позволяет покупателям отменять заказы в личном кабинете, если статус заказа позволяет это сделать (например, "обработка" или "ожидание оплаты"). Однако в ряде случаев требуется полностью отключить эту возможность — чтобы избежать путаницы, уменьшить нагрузку на службу поддержки или по политике магазина. Часто стандартные настройки WooCommerce не предоставляют для этого удобного переключателя, а плагины могут быть избыточными или конфликтовать с кастомными решениями.
Как понять, что отмена заказов активна
- Заходите в личный кабинет покупателя;
- Открываете список заказов;
- Если у заказа есть кнопка "Отменить заказ", значит, возможность отмены активна;
- В админке WooCommerce также можно проверить права ролей на изменение статусов заказов.
Пошаговое решение: полное отключение отмены заказов через личный кабинет
Для отключения отмены заказов нам нужно заблокировать функционал отмены заказов на фронтенде и предотвратить возможность отмены через REST API и AJAX-запросы.
1. Удаляем кнопку "Отменить заказ" из личного кабинета
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
add_filter('woocommerce_my_account_my_orders_actions', 'disable_cancel_order_button', 10, 2);
function disable_cancel_order_button($actions, $order) {
if (isset($actions['cancel'])) {
unset($actions['cancel']);
}
return $actions;
}Этот фильтр удалит кнопку отмены из списка заказов.
2. Отключаем возможность отмены через REST API и AJAX
Отмена заказа может быть вызвана через AJAX или REST API. Чтобы полностью блокировать отмену, добавим проверку на сервере.
add_action('woocommerce_before_cancel_order', 'block_cancel_order_request', 10, 1);
function block_cancel_order_request($order_id) {
wp_die('Отмена заказов через личный кабинет отключена.');
}Этот хук останавливает процесс отмены заказа.
3. Дополнительно блокируем отмену через изменение статуса вручную (админка)
Если хотите запретить отмену даже администраторам через админку, можно добавить проверку:
add_action('woocommerce_order_status_changed', 'prevent_order_cancellation', 10, 3);
function prevent_order_cancellation($order_id, $old_status, $new_status) {
if ($new_status === 'cancelled') {
wp_die('Отмена заказов запрещена.');
}
}Проверка результата после внедрения
- Перейдите в личный кабинет покупателя и обновите страницу заказов — кнопка "Отменить заказ" должна исчезнуть;
- Попробуйте отменить заказ программно через REST API — запрос должен прерваться с сообщением об ошибке;
- В админке попробуйте изменить статус заказа на "Отменён" — появится ошибка и изменение не сохранится.
Частые ошибки и как исправить
- Кнопка отмены не исчезает: проверьте подключение кода, очистите кеш страницы и кеш плагинов, убедитесь, что код добавлен в правильное место (дочерняя тема или плагин).
- Ошибка при отмене заказа через REST API не появляется: возможно, другой плагин перехватывает запросы, добавьте приоритет хука выше (например, 1 вместо 10).
- Администраторы могут отменять заказ: блокировка через
woocommerce_order_status_changedдействует только если вы используетеwp_die(), альтернативно можно откатить статус:
add_action('woocommerce_order_status_changed', 'revert_order_cancellation', 10, 3);
function revert_order_cancellation($order_id, $old_status, $new_status) {
if ($new_status === 'cancelled') {
$order = wc_get_order($order_id);
$order->update_status($old_status, 'Отмена заказов отключена.');
}
}Практические советы по безопасности и производительности
- Размещайте кастомный код в дочерней теме или в отдельном плагине, чтобы не потерять изменения при обновлении.
- Проверяйте совместимость с другими плагинами, особенно с теми, которые могут влиять на заказы (например, платёжные шлюзы).
- Для предотвращения обхода ограничений через REST API на сервере можно ограничить доступ по ролям с помощью
rest_authentication_errors. - Помните, что полное отключение отмены заказов снижает гибкость интерфейса для пользователей — заранее предупредите клиентов о такой политике.
Сравнение способов отключения отмены заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление кнопки в личном кабинете | Убирает визуальную возможность отмены | Простая реализация, не влияет на сервер | Можно отменить через API или админку |
Блокировка с помощью хука woocommerce_before_cancel_order | Останавливает отмену на сервере | Надежно блокирует отмену через фронтенд и API | Не блокирует админку без дополнительного кода |
| Блокировка изменения статуса в админке | Запрещает отмену через админ-панель | Полное предотвращение отмены | Может вызвать неудобства для администраторов |