Come accedere al corpo di una richiesta WP API in una route personalizzata?
Ho creato una route personalizzata in WP API (v2 beta 4) per impostare un'opzione del sito. Sto usando AngularJS per effettuare la chiamata API, ma per qualche motivo non riesco ad accedere ai dati inviati nella richiesta. Ecco quello che ho finora:
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
}
})
}
}]);
Questo invia con successo la richiesta e i dati inviati appaiono più o meno così:
{"option":"siteColor","value":"ff0000"}
La richiesta arriva con successo alla mia route personalizzata e alla callback che ho specificato. Ecco la funzione di callback all'interno della classe:
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', __( 'Impossibile aggiornare l\'opzione.' ), array( 'status' => 400 ) );
}
}
Il problema è che questo fallisce sempre e restituisce WP_Error perché $request['option'] è null.
Quando eseguo var_dump($request), vedo la stringa JSON nella parte ['body'] dell'oggetto, ma non mi permette di accedervi quando chiamo quella parte dell'array. Ho anche provato a utilizzare i metodi per recuperare i parametri indicati nella documentazione (http://v2.wp-api.org/extending/adding/), ma nessuno di questi sembra restituire i dati. Mi sta sfuggendo qualcosa di veramente basilare?

Puoi utilizzare $request->get_json_params()
che restituirà un array di chiave => valori.
Con queste condizioni (possibilmente alcune in più):
- Il client che invia la richiesta ha
Content-Type: application/json
nell'header - C'è un body raw come
{"option":"siteColor","value":"ff0000"}
.
https://developer.wordpress.org/reference/classes/wp_rest_request/get_json_params/

In una risposta precedente ho potuto accedere ai dati in un endpoint personalizzato utilizzando
$parameters = $request->get_query_params();
Controlla i parametri della query per option
$parameters['option']
Due opzioni per ottenere il corpo della richiesta:
$body = $request->get_body();
$body_params = $request->get_body_params();
Esempio
<?php
function my_awesome_func( WP_REST_Request $request ) {
// Due modi per ottenere il corpo dalla richiesta.
$body = $request->get_body();
$body_params = $request->get_body_params();
// Puoi accedere ai parametri tramite accesso diretto all'array sull'oggetto:
$param = $request['some_param'];
// Oppure tramite il metodo helper:
$param = $request->get_param( 'some_param' );
// Puoi ottenere l'insieme combinato e unito dei parametri:
$parameters = $request->get_params();
// I singoli set di parametri sono anch'essi disponibili, se necessari:
$parameters = $request->get_url_params();
$parameters = $request->get_query_params();
$parameters = $request->get_default_params();
// Gli upload non sono uniti, ma possono essere accessi separatamente:
$parameters = $request->get_file_params();
}
