В настройках способа доставки СДЭК невозможно выбрать город отправки. При вводе названия города в поле "Город" выпадающий список не появляется, AJAX-запрос к эндпоинту admin-ajax.php?action=official_cdek-cities возвращает 500 Internal Server Error с текстом "Error happened at CDEKDelivery".
Без указания города отправки плагин не может рассчитывать стоимость доставки.
Проблема воспроизводится на shared-хостингах, где wp_remote_request с методом GET не транслирует body-параметры в query string.
Как воспроизвести:
- Установить плагин на shared-хостинг
- Перейти в настройки СДЭК
- Начать вводить название города в поле "Город"
- Вместо выпадающего списка — ошибка, город невозможно выбрать
Та же проблема может затрагивать другие GET-запросы: загрузку списков ПВЗ на чекауте, определение города покупателя по индексу, поиск заказов по номеру.
Конкретная причина и исправление:
В src/Transport/HttpClient.php:
if (!empty($data)) {
$config['body'] = ($method === WP_REST_Server::READABLE) ? $data : wp_json_encode($data);
}
Для GET-запросов параметры (name, country_code) помещаются в тело запроса вместо URL. API СДЭК игнорирует тело GET-запроса и возвращает ответ без заголовка content-type: application/json, что приводит к UnparsableAnswerException.
Предлагаемое исправление:
if (!empty($data)) {
if ($method === WP_REST_Server::READABLE) {
$url .= (strpos($url, '?') === false ? '?' : '&') . http_build_query($data);
} else {
$config['body'] = wp_json_encode($data);
}
}
GET-параметры добавляются в URL как query string, POST/PUT/DELETE — JSON в body. Обратно совместимо.
В настройках способа доставки СДЭК невозможно выбрать город отправки. При вводе названия города в поле "Город" выпадающий список не появляется, AJAX-запрос к эндпоинту admin-ajax.php?action=official_cdek-cities возвращает 500 Internal Server Error с текстом "Error happened at CDEKDelivery".
Без указания города отправки плагин не может рассчитывать стоимость доставки.
Проблема воспроизводится на shared-хостингах, где wp_remote_request с методом GET не транслирует body-параметры в query string.
Как воспроизвести:
Та же проблема может затрагивать другие GET-запросы: загрузку списков ПВЗ на чекауте, определение города покупателя по индексу, поиск заказов по номеру.
Конкретная причина и исправление:
В src/Transport/HttpClient.php:
Для GET-запросов параметры (name, country_code) помещаются в тело запроса вместо URL. API СДЭК игнорирует тело GET-запроса и возвращает ответ без заголовка content-type: application/json, что приводит к UnparsableAnswerException.
Предлагаемое исправление:
GET-параметры добавляются в URL как query string, POST/PUT/DELETE — JSON в body. Обратно совместимо.