WooCommerce: как отключить удаление заказа после изменения заказа программно

Диагностика проблемы: почему заказы удаляются при изменении

В стандартном WooCommerce удаление заказа по изменению не предусмотрено, однако при кастомных доработках или использовании сторонних плагинов могут возникать ситуации, когда заказ удаляется или теряется при изменении статуса или данных заказа. Это приводит к потере информации и проблемам с учётом.

Чтобы понять, что вызывает удаление, нужно:

  • Проверить кастомные хуки и фильтры, связанные с woocommerce_update_order и save_post_shop_order.
  • Отключить сторонние плагины, особенно те, которые работают с заказами.
  • Включить WP_DEBUG и отследить ошибки в момент изменения заказа.
  • Проверить, нет ли в теме или плагинах вызовов wp_delete_post для типа shop_order.

Пошаговое решение: блокируем удаление заказа при изменении

Если проблема вызвана кастомным кодом или плагином, который удаляет заказ после его изменения, можно принудительно заблокировать удаление заказов программно.

1. Запрет удаления заказов через хук

Добавьте следующий код в functions.php вашей темы или в отдельный плагин:

add_filter('wp_trash_post', function($post_id) {
    $post = get_post($post_id);
    if ($post && $post->post_type === 'shop_order') {
        // Блокируем перемещение заказа в корзину
        return false;
    }
    return $post_id;
}, 10, 1);

Этот фильтр отменит перемещение заказов в корзину, тем самым предотвращая их удаление.

2. Отключение удаления заказов через REST API

Если удаление происходит через REST API, можно запретить это для заказов:

add_filter('rest_pre_dispatch', function($response, $server, $request) {
    if ($request->get_method() === 'DELETE' && $request->get_route() === '/wc/v3/orders/(?P<id>\d+)') {
        $order_id = $request->get_param('id');
        $order = wc_get_order($order_id);
        if ($order) {
            return new WP_Error('rest_forbidden', 'Удаление заказов отключено.', array('status' => 403));
        }
    }
    return $response;
}, 10, 3);

Проверка результата после внедрения

Для проверки сделайте следующее:

  • Попробуйте изменить заказ через админку и сохранить.
  • Попытайтесь удалить заказ вручную через админку — кнопка «Удалить» должна быть заблокирована или не работать.
  • Если вы используете REST API, попробуйте выполнить DELETE-запрос к заказу — запрос должен возвращать ошибку 403.
  • Проверьте, что заказ не пропадает и не перемещается в корзину.

Частые ошибки и как их исправить

  • Ошибка: Заказы всё равно удаляются после обновления.
  • Причина: Код не подключен или конфликтует с плагинами.
  • Решение: Отключите сторонние плагины, протестируйте с дефолтной темой, повторно добавьте код.
  • Ошибка: REST API удаление не блокируется.
  • Причина: Неправильный хук или маршрут в фильтре.
  • Решение: Проверьте точный маршрут REST API с помощью rest_get_server() и корректно укажите маршрут и метод.

Практические советы по безопасности и производительности

  • Всегда делайте резервную копию базы перед изменениями, особенно при вмешательстве в заказы.
  • Используйте детальный лог ошибок для отслеживания неожиданных удалений.
  • Минимизируйте использование сторонних плагинов, которые изменяют поведение заказов.
  • Для оптимизации используйте кеширование, но исключите из кеша страницы с динамическими заказами.

Сравнение вариантов блокировки удаления заказов

МетодОписаниеПлюсыМинусы
Фильтр wp_trash_postБлокирует перемещение заказа в корзинуПростая реализация, работает для админкиНе блокирует удаление через REST API
Фильтр rest_pre_dispatchБлокирует удаление через REST APIЗащищает удаление из внешних сервисовСложнее в настройке, требует точного маршрута
Отключение кнопок удаления (CSS/JS)Скрывает элементы интерфейса удаленияПростое решение для UIНе защищает от программного удаления
Как отключить XML-RPC в WordPress без плагинов
09.02.2026
WooCommerce: как отключить удаление заказа после изменения заказа программно
02.06.2026
WooCommerce: как исключить повторную отправку письма при изменении статуса заказа
03.05.2026
WooCommerce: как исключить повторную отправку письма при изменении статуса заказа
20.05.2026
WooCommerce: как использовать хуки для изменения статей оплаты
07.05.2026