WooCommerce: не работает обновление статуса заказа через REST API — как исправить

Проблема: обновление статуса заказа через REST API не применяется

При попытке изменить статус заказа в WooCommerce через REST API изменения не сохраняются, либо возвращается успешный ответ, но статус не меняется. Это частая проблема при интеграции с внешними системами автоматизации или CRM.

Диагностика проблемы

  • Проверить версию WooCommerce и WordPress — устаревшее ПО может содержать баги.
  • Убедиться, что используемый пользователь API имеет права на редактирование заказов.
  • Проверить, что при запросе REST API используется правильный эндпоинт и HTTP метод (PATCH или PUT).
  • Посмотреть логи сервера и WooCommerce на предмет ошибок или предупреждений.
  • Проверить, не блокирует ли безопасность (например, плагины типа Wordfence) REST API запросы.

Пошаговое решение проблемы с обновлением статуса заказа

1. Проверяем права пользователя API

Пользователь, под которым выполняется запрос, должен иметь роль с правом edit_shop_orders. Обычно это роль shop_manager или administrator. Для проверки можно выполнить в PHP:

if (current_user_can('edit_shop_orders')) {
    echo 'Права корректны';
} else {
    echo 'Нет прав для редактирования заказов';
}

2. Правильный формат запроса к REST API

Пример запроса для обновления статуса заказа через REST API (используем PATCH):

PATCH /wp-json/wc/v3/orders/123
{
  "status": "completed"
}

Обязательно убедитесь, что передаете правильный ID заказа и статус из списка pending, processing, on-hold, completed, cancelled, refunded, failed.

Пример кода на PHP с использованием WP HTTP API:

$order_id = 123;
$data = ['status' => 'completed'];
$response = wp_remote_request(
    "https://example.com/wp-json/wc/v3/orders/{$order_id}",
    [
        'method'  => 'PATCH',
        'headers' => [
            'Authorization' => 'Basic ' . base64_encode('consumer_key:consumer_secret'),
            'Content-Type'  => 'application/json',
        ],
        'body'    => json_encode($data),
    ]
);
if (is_wp_error($response)) {
    error_log('Ошибка обновления заказа: ' . $response->get_error_message());
} else {
    $body = json_decode(wp_remote_retrieve_body($response), true);
    error_log('Ответ: ' . print_r($body, true));
}

3. Проверяем фильтры и хуки, которые могут блокировать обновление

В теме или плагинах могут быть фильтры, блокирующие сохранение изменений заказа. Чтобы проверить, временно переключитесь на стандартную тему (например, Twenty Twenty-Three) и отключите все плагины кроме WooCommerce. Если проблема исчезнет, включайте по одному, чтобы выявить виновника.

4. Обход проблемы с помощью кастомного обработчика

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

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/order/(?P<id>\d+)', [
        'methods'  => 'POST',
        'callback' => function ($request) {
            $order_id = $request['id'];
            $status = $request->get_param('status');
            $order = wc_get_order($order_id);
            if (!$order) {
                return new WP_Error('no_order', 'Заказ не найден', ['status' => 404]);
            }
            $order->update_status($status, 'Статус обновлен через кастомный API');
            return ['success' => true, 'order_id' => $order_id, 'new_status' => $status];
        },
        'permission_callback' => function () {
            return current_user_can('edit_shop_orders');
        },
    ]);
});

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

  • Выполните запрос к REST API с обновлением статуса и проверьте код ответа — должен быть 200 и тело с новым статусом.
  • Зайдите в админку WooCommerce, откройте заказ и убедитесь, что статус действительно изменился.
  • Если используете кастомный API, протестируйте его через Postman или curl.
  • Проверьте логи сервера на предмет ошибок и предупреждений.

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

  • Неправильные права пользователя API: исправьте роль пользователя или создайте нового с нужными правами.
  • Неверный HTTP метод: используйте PATCH или PUT для обновления, не POST.
  • Отсутствие заголовка авторизации: добавьте Basic Auth или OAuth в запрос.
  • Плагины безопасности блокируют REST API: временно отключите или настройте исключения.
  • Кэширование на уровне сервера: отключите кэш для REST API URL или настройте исключения.

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

  • Используйте отдельного пользователя API с минимально необходимыми правами (рекомендуется роль shop_manager).
  • Ограничьте доступ к REST API по IP, если возможно, через .htaccess или firewall.
  • Логируйте все действия по изменению заказов через REST API для аудита.
  • Для повышения производительности отключите лишние плагины и темы при работе с API.
  • Используйте WPShop продукт Clearfy Pro для оптимизации и безопасности сайта.
WooCommerce: не показываются вариации при выборе атрибутов — как исправить
15.05.2026
WooCommerce: не отображается кнопка «Добавить в корзину» при использовании кастомных шаблонов — как исправить
25.06.2026
WooCommerce: отладка проблем с распоряжением заказами и их статусами
17.04.2026
WooCommerce: автоматическое отключение неактивных вариантов товаров
18.05.2026
WooCommerce: автоматическая синхронизация складских остатков с внешним инвентарём
25.04.2026