Проблема: обновление статуса заказа через 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 для оптимизации и безопасности сайта.