¿Cómo accedo al cuerpo de una solicitud de API de WP en una ruta personalizada?

11

He creado una ruta personalizada en WP API (v2 beta 4) para establecer una opción de sitio. Estoy usando AngularJS para hacer la llamada 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 con éxito la solicitud y los datos publicados se ven así:

{"option":"siteColor","value":"ff0000"}

La solicitud llega con éxito a mi ruta personalizada y a la devolución de llamada que he especificado. Aquí está esa función de devolución de llamada 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', __( 'Cannot update option.' ), array( 'status' => 400 ) );
    }

}

El problema es que esto siempre falla y devuelve el WP_Error porque $ request ['opción'] es nulo.

Cuando var_dump ($ request), veo la cadena JSON en la parte ['cuerpo'] del objeto, pero no me deja acceder a eso cuando llamo a esa parte de la matriz. También he intentado usar los métodos para recuperar los parámetros indicados en la documentación ( http://v2.wp-api.org/extending/adding/ ), pero ninguno de ellos parece devolver los datos. ¿Me estoy perdiendo algo realmente básico aquí?

Ryan Hale
fuente
alguna suerte con esto?
jgraup

Respuestas:

6

En una respuesta anterior se pudo acceder a los datos en un punto final personalizado utilizando

$parameters = $request->get_query_params(); 

Verifique los parámetros de consulta para option

$parameters['option']

<?php
function my_awesome_func( WP_REST_Request $request ) {
    // You can access parameters via direct array access on the object:
    $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_default_params();

    // Uploads aren't merged in, but can be accessed separately:
    $parameters = $request->get_file_params();
}
jgraup
fuente
5

Puedes usar $request->get_body()

Gerardlamo
fuente
5

Puede usar $request->get_json_params()cual devolverá una matriz de clave => valores.

Con estas condiciones (posiblemente algunas más):

  1. El cliente que envía la solicitud tiene Content-Type: application/jsonen el encabezado
  2. Hay un cuerpo crudo como {"option":"siteColor","value":"ff0000"}.

https://developer.wordpress.org/reference/classes/wp_rest_request/get_json_params/

mkly
fuente
Esto es exactamente lo que estaba buscando. ¡Gracias!
Jason Ellis