1

I have read the wordpress page about this but didn't find a solution.

Here are my details:

register rest route:

 register_rest_route( '/jwt-auth/v1', '/user', array( 'methods' => array( 'GET', 'POST', 'PUT' ), 'callback' => array( $this, 'user_get_information' ), 'permission_callback' => function() { return is_user_logged_in(); }, ), ); 

user function :

public function user_get_information( $request ) { $user_id = get_current_user_id(); $data = array(); if ( filter_input( INPUT_SERVER, 'REQUEST_METHOD' ) === 'POST' ) { $params = array( 'nickname', 'first_name', 'last_name', 'mobile', 'favorites', 'playtime', ); $allreq = $request->get_params(); foreach ( $allreq as $req => $val ) { if ( ! empty( $val ) && in_array( $req, $params, true ) ) { if ( 'favorites' === $req ) { // do somthing } elseif ( 'playtime' === $req ) { // i want this json data validate and sanitize then add to database $meta = get_user_meta( $user_id, 'playtime', true ); $schema = $this->user_playtime_meta_schema(); if ( rest_validate_value_from_schema( $val, $schema ) ) { $sanitized = rest_sanitize_value_from_schema( $val, $schema ); } if ( ! is_array( $meta ) ) { $meta = array(); } $meta[] = $sanitized; // $meta = array(); } else { $meta = $val; } $user_meta = update_user_meta( $user_id, 'playtime', $meta ); } } } if ( is_wp_error( $user_meta ) ) { $error_string = $user_meta->get_error_message(); return $error_string; } else { $info = get_user_by( 'ID', $user_id ); $meta = get_user_meta( $user_id ); $img_id = $meta['image_select'][0]; if ( $img_id ) { $img_url = wp_get_attachment_url( $img_id ); } $data['id'] = $info->ID; $data['login'] = $info->user_login; $data['email'] = $info->user_email; $data['display_name'] = $info->display_name; $data['image'] = $img_url; $data['nickname'] = $meta['nickname'][0]; $data['first_name'] = $meta['first_name'][0]; $data['last_name'] = $meta['last_name'][0]; $data['mobile'] = $meta['mobile'][0]; $data['favorites'] = get_user_meta( $user_id, 'favorites', true ); $data['playtime'] = get_user_meta( $user_id, 'playtime', true ); return $data; } } 

schema :

public function user_playtime_meta_schema() { if ( $this->playtime_schema ) { return $this->playtime_schema; } $this->playtime_schema = array( 'type' => array( 'type' => 'object', 'properties' => array( 'song' => array( 'type' => 'object', 'properties' => array( 'name' => array( 'type' => 'string', ), 'id' => array( 'type' => 'number', ), 'notes' => array( 'type' => 'number', ), ), ), 'time' => array( 'type' => 'string', ), 'date' => array( 'type' => 'string', ), 'score' => array( 'type' => 'string', ), 'progress' => array( 'type' => 'string', ), ), ), ); return $this->playtime_schema; } 

try send data like this:

{"playtime":{"song": { "name": "Training New", "id": 758, "notes": 65 }, "time": "10:27:19 PM", "score": "[[76,\"perfect\"],[74,\"perfect\"],[77,\"perfect\"],[76,\"perfect\"],[74,\"late\"],[72,\"late\"],[74,\"perfect\"],[76,\"perfect\"],[76,\"perfect\"],[76,\"perfect\"],[74,\"perfect\"],[77,\"perfect\"],[76,\"late\"],[74,\"late\"],[72,\"perfect\"],[74,\"perfect\"],[76,\"perfect\"],[76,\"perfect\"],[74,\"perfect\"],[72,\"perfect\"],[71,\"perfect\"],[67,\"perfect\"],[74,\"perfect\"],[72,\"perfect\"],[74,\"perfect\"],[71,\"perfect\"],[72,\"perfect\"],[74,\"late\"],[71,\"perfect\"],[72,\"perfect\"],[71,\"late\"],[67,\"perfect\"]]", "date": "8/17/2020", "progress": "4%"} } 

everything works , but if i send some bad information like this :

 {"playtime":{"wrong": { "number": "1", "notes": 525 }, "time": "10:27:19 PM", "progress": "4%"} } 

also works and wrong data would be saved in database!

Any help thanks in advance.

4
  • 1
    This is not how schema works, so your question may appear to some of it's visitors just stating the fact - not being a question. Commented Dec 4, 2020 at 19:12
  • Oh sry , ill fix it . Commented Dec 4, 2020 at 22:16
  • 1
    The register_rest_route accepts a schema parameter directly, have you tried using it in there instead of inside your own loop? Commented Dec 7, 2020 at 14:34
  • @ChrisHaas yes i did this before but not working with custom api. Commented Dec 8, 2020 at 6:20

1 Answer 1

4
+50

I've checked your example and there is a problem with your schema and in the way you've worked with.

First let me show you the correct schema for your example:

function testSchema() { return [ 'type' => 'object', 'required' => [ 'playtime', ], 'properties' => [ 'playtime' => [ 'type' => 'object', 'required' => [ 'song', 'time', 'score', 'date', 'progress', ], 'properties' => [ 'song' => [ 'type' => 'object', 'required' => [ 'name', 'id', 'notes', ], 'properties' => [ 'name' => [ 'type' => 'string', ], 'id' => [ 'type' => 'integer', 'required' => true, ], 'notes' => [ 'type' => 'integer', ], ], ], 'time' => [ 'type' => 'string', ], 'score' => [ 'type' => 'string', ], 'date' => [ 'type' => 'string', ], 'progress' => [ 'type' => 'progress', ], ], ], ], ]; } 

To validate and sanitize your input your callback method have to look like this:

function testCallback(WP_REST_Request $request) { $values = $request->get_json_params(); $schema = testSchema(); $result = rest_validate_value_from_schema($values, $schema); if (is_wp_error($result)) { var_dump($result); die('error'); } else { $values = rest_sanitize_value_from_schema($values, $schema); var_dump($values); die('success'); } } 

First you have to validate input data against your schema and if input pass it then you have to sanitize the values as you describe them in your schema - that's it.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you so much sir, u made my day :).I think the key thing is $request->get_json_params(); , and your schema just work super good.
As far I know this is the proper way to get the body of JSON request :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.