Como acesso o corpo de uma solicitação de API do WP em uma rota personalizada?

11

Criei uma rota personalizada na API do WP (v2 beta 4) para definir uma opção de site. Estou usando o AngularJS para fazer a chamada da API e, por algum motivo, não consigo acessar os dados enviados dentro da solicitação. Aqui está o que eu tenho até agora:

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
                    }  
         })

    }

}]);

Isso envia com êxito a solicitação e os dados publicados são mais ou menos assim:

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

A solicitação chega com êxito à minha rota personalizada e ao retorno de chamada que eu especifiquei. Aqui está essa função de retorno de chamada dentro da 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', __( 'Cannot update option.' ), array( 'status' => 400 ) );
    }

}

O problema é que isso sempre falha e retorna o WP_Error porque $ request ['option'] é nulo.

Quando var_dump ($ request), vejo a string JSON na parte ['body'] do objeto, mas ela não me permite acessar isso ao chamar essa parte da matriz. Também tentei usar os métodos para recuperar parâmetros anotados na documentação ( http://v2.wp-api.org/extending/adding/ ), mas nenhum deles parece retornar os dados também. Estou perdendo algo realmente básico aqui?

Ryan Hale
fonte
alguma sorte com isso?
jgraup

Respostas:

6

Em uma resposta anterior, foi possível acessar os dados em um terminal personalizado usando

$parameters = $request->get_query_params(); 

Verifique os 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
fonte
5

Você pode usar $request->get_body()

Gerardlamo
fonte
5

Você pode usar o $request->get_json_params()que retornará uma matriz de key => values.

Com estas condições (possivelmente mais algumas):

  1. O cliente que está enviando a solicitação tem Content-Type: application/jsonno cabeçalho
  2. Existe um corpo cru como {"option":"siteColor","value":"ff0000"}.

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

mkly
fonte
Era exatamente isso que eu estava procurando. Obrigado!
Jason Ellis