Как получить доступ к телу запроса WP API в пользовательском маршруте?
Я создал пользовательский маршрут в WP API (v2 beta 4) для установки опции сайта. Я использую AngularJS для выполнения API-вызова, но по какой-то причине я не могу получить доступ к данным, отправленным в запросе. Вот что у меня есть на данный момент:
gvl.service('gvlOptionService', ['$http', function($http) {
this.updateOption = function(option, value) {
return $http({
method : 'POST',
url : wpAPIdata.gvlapi_base + 'options',
data : { "option" : option,
"value" : value
},
headers : { 'Content-Type': 'application/x-www-form-urlencoded',
'X-WP-Nonce' : wpAPIdata.api_nonce
}
})
}
}]);
Это успешно отправляет запрос, и отправленные данные выглядят примерно так:
{"option":"siteColor","value":"ff0000"}
Запрос успешно доходит до моего пользовательского маршрута и до указанного callback-функции. Вот эта callback-функция внутри класса:
public function update_option( WP_REST_Request $request ) {
if(isset($request['option']) && $request['option'] == 'siteColor') {
$request_prepared = $this->prepare_item_for_database($request);
$color_updated = update_option('site_color', $request_prepared['value'], false);
if($color_updated) {
$response = $this->prepare_item_for_response('site_color');
$response->set_status( 201 );
$response->header('Location', rest_url('/gvl/v1/options'));
return $response;
} else {
// ...
}
} else {
return new WP_Error( 'cant_update_option', __( 'Невозможно обновить опцию.' ), array( 'status' => 400 ) );
}
}
Проблема в том, что это всегда завершается неудачей и возвращает WP_Error, потому что $request['option'] равен null.
Когда я выполняю var_dump($request), я вижу JSON-строку в части ['body'] объекта, но не могу получить к ней доступ при обращении к этой части массива. Я также пробовал использовать методы для получения параметров, указанные в документации (http://v2.wp-api.org/extending/adding/), но ни один из них тоже не возвращает данные. Может я упускаю что-то очень простое?

Вы можете использовать $request->get_json_params()
, который вернёт массив в формате ключ => значение.
При соблюдении следующих условий (возможно, потребуются дополнительные):
- Клиент, отправляющий запрос, имеет заголовок
Content-Type: application/json
- Имеется необработанное тело запроса вида
{"option":"siteColor","value":"ff0000"}
.
https://developer.wordpress.org/reference/classes/wp_rest_request/get_json_params/

В предыдущем ответе я смог получить доступ к данным в пользовательской конечной точке с помощью
$parameters = $request->get_query_params();
Проверьте параметры запроса на наличие option
$parameters['option']
Два способа получить тело запроса:
$body = $request->get_body();
$body_params = $request->get_body_params();
Пример
<?php
function my_awesome_func( WP_REST_Request $request ) {
// Два способа получить тело запроса.
$body = $request->get_body();
$body_params = $request->get_body_params();
// Вы можете получить доступ к параметрам через прямое обращение к массиву объекта:
$param = $request['some_param'];
// Или через вспомогательный метод:
$param = $request->get_param( 'some_param' );
// Вы можете получить объединенный набор параметров:
$parameters = $request->get_params();
// Отдельные наборы параметров также доступны, если нужно:
$parameters = $request->get_url_params();
$parameters = $request->get_query_params();
$parameters = $request->get_default_params();
// Загружаемые файлы не объединяются, но доступны отдельно:
$parameters = $request->get_file_params();
}
