Cum accesez corpul unei cereri WP API într-o rută personalizată?
Am creat o rută personalizată în WP API (v2 beta 4) pentru a seta o opțiune de site. Folosesc AngularJS pentru a face apelul API și din anumite motive nu pot accesa datele trimise în cerere. Iată ce am până acum:
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
}
})
}
}]);
Aceasta trimite cu succes cererea iar datele postate arată cam așa:
{"option":"siteColor","value":"ff0000"}
Cererea ajunge cu succes la ruta mea personalizată și la callback-ul pe care l-am specificat. Iată funcția callback din clasă:
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', __( 'Cannot update option.' ), array( 'status' => 400 ) );
}
}
Problema este că aceasta eșuează întotdeauna și returnează WP_Error deoarece $request['option'] este null.
Când folosesc var_dump($request), văd șirul JSON în porțiunea ['body'] a obiectului, dar nu-mi permite să accesez acea parte când apelez acea porțiune a array-ului. Am încercat de asemenea să folosesc metodele pentru recuperarea parametrilor menționate în documentație (http://v2.wp-api.org/extending/adding/), dar niciuna dintre acestea nu pare să returneze datele. Am ratat ceva elementar aici?

Poți folosi $request->get_json_params()
care va returna un array de tip cheie => valoare.
Cu următoarele condiții (posibil și altele):
- Clientul care trimite cererea are în header
Content-Type: application/json
- Există un body raw de tipul
{"option":"siteColor","value":"ff0000"}
.
https://developer.wordpress.org/reference/classes/wp_rest_request/get_json_params/

Într-un răspuns anterior am reușit să accesez datele într-un endpoint personalizat folosind
$parameters = $request->get_query_params();
Verifică parametrii query pentru option
$parameters['option']
Două opțiuni pentru a obține body-ul request-ului:
$body = $request->get_body();
$body_params = $request->get_body_params();
Exemplu
<?php
function my_awesome_func( WP_REST_Request $request ) {
// Două modalități de a obține body-ul din request.
$body = $request->get_body();
$body_params = $request->get_body_params();
// Poți accesa parametrii prin accesarea directă a array-ului pe obiect:
$param = $request['some_param'];
// Sau prin metoda helper:
$param = $request->get_param( 'some_param' );
// Poți obține setul combinat de parametri:
$parameters = $request->get_params();
// Seturile individuale de parametri sunt de asemenea disponibile, dacă e nevoie:
$parameters = $request->get_url_params();
$parameters = $request->get_query_params();
$parameters = $request->get_default_params();
// Upload-urile nu sunt incluse, dar pot fi accesate separat:
$parameters = $request->get_file_params();
}
