¿Cómo accedo al cuerpo de una solicitud de WP API en una ruta personalizada?
He creado una ruta personalizada en WP API (v2 beta 4) para establecer una opción del sitio. Estoy usando AngularJS para hacer la llamada a la API y, por alguna razón, no puedo acceder a los datos enviados dentro de la solicitud. Esto es lo que tengo hasta ahora:
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
}
})
}
}]);
Esto envía la solicitud exitosamente y los datos enviados se ven algo así:
{"option":"siteColor","value":"ff0000"}
La solicitud llega exitosamente a mi ruta personalizada y al callback que he especificado. Aquí está la función callback dentro de la clase:
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', __( 'No se puede actualizar la opción.' ), array( 'status' => 400 ) );
}
}
El problema es que esto siempre falla y devuelve el WP_Error porque $request['option'] es nulo.
Cuando hago var_dump($request), veo la cadena JSON en la parte ['body'] del objeto, pero no me permite acceder a ella cuando llamo a esa parte del array. También he intentado usar los métodos para recuperar parámetros mencionados en la documentación (http://v2.wp-api.org/extending/adding/), pero ninguno de ellos parece devolver los datos tampoco. ¿Me estoy perdiendo algo realmente básico aquí?

Puedes usar $request->get_json_params()
que retornará un array de clave => valor.
Con estas condiciones (posiblemente algunas más):
- El cliente que envía la solicitud tiene
Content-Type: application/json
en la cabecera - Hay un cuerpo en crudo como
{"option":"siteColor","value":"ff0000"}
.
https://developer.wordpress.org/reference/classes/wp_rest_request/get_json_params/

En una respuesta anterior pude acceder a los datos en un endpoint personalizado usando
$parameters = $request->get_query_params();
Verifica los parámetros de consulta para option
$parameters['option']
Dos opciones para obtener el cuerpo de la solicitud:
$body = $request->get_body();
$body_params = $request->get_body_params();
Ejemplo
<?php
function my_awesome_func( WP_REST_Request $request ) {
// Dos formas de obtener el cuerpo de la solicitud.
$body = $request->get_body();
$body_params = $request->get_body_params();
// Puedes acceder a los parámetros mediante acceso directo al array en el objeto:
$param = $request['some_param'];
// O mediante el método auxiliar:
$param = $request->get_param( 'some_param' );
// Puedes obtener el conjunto combinado de parámetros:
$parameters = $request->get_params();
// Los conjuntos individuales de parámetros también están disponibles, si es necesario:
$parameters = $request->get_url_params();
$parameters = $request->get_query_params();
$parameters = $request->get_default_params();
// Los archivos subidos no se combinan, pero se pueden acceder por separado:
$parameters = $request->get_file_params();
}
