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',
  ) );
} );

function my_awesome_func( WP_REST_Request $request ) {
    // TODO
}

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.