Desde la versión 4.7 WordPress integra una REST API y hoy les voy hablar sobre un caso peculiar sobre las rutas personalizadas.
Digamos que tenemos esta ruta personalizada en un plugin para usar un formulario de contacto
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/foo', array(
'methods' => 'POST',
'callback' => 'my_awesome_func',
) );
} );
<p>function my_awesome_func( WP_REST_Request $request ) {
// TODO
}
</p>
Y para enviar los datos usamos la vieja y confiable funcion AJAX y que es algo como esto:
var dataValue = { "hello": "there" };
$.ajax({
url: 'http://wordpress.local/wp-json/myplugin/v1/foo',
dataType: 'json',
type: 'post',
contentType: 'application/json',
data: JSON.stringify( dataValue ),
processData: false,
success: function( res ){
// TODO
},
});
Ahora, la parte divertida (?)
Como se obtiene la data que estamos enviando al backend para trabajar con ella?
De seguro pueden encontrar por ahí en internet alguien que les diga:
To get JSON data (or any raw input), use php://input.
lo cual no esta del todo mal pero ya que estamos usando WordPress podemos aprovechar el objeto request.
La documentación dice que:
By default, routes receive all arguments passed in from the request. These are merged into a single set of parameters, then added to the Request object, which is passed in as the first parameter to your endpoint.
Entonces, podemos usar:
$param = $request['some_param'];
// Or via the helper method:
$param = $request->get_param( 'some_param' );
// You can get the combined, merged set of parameters:
$parameters = $request->get_params();
// The individual sets of parameters are also available, if needed:
$parameters = $request->get_url_params();
$parameters = $request->get_query_params();
$parameters = $request->get_body_params();
$parameters = $request->get_json_params();
$parameters = $request->get_default_params();
// Uploads aren't merged in, but can be accessed separately:
$parameters = $request->get_file_params();
Y para nuestro ejemplo estaríamos usando $parameters = $request->get_json_params();
y accedemos a los parámetros de esta forma: $parameters['hello']
.
Espero que esto le sirva a alguien más.