Решил немного усложнить наш предыдущий код, добавив в него простую проверку доступа по API KEY. В примере ниже будет рассмотрена самая простая реализация проверки доступа по ключу. В реальных приложения, рекомендуется использовать что-то посложнее, типа проверка доступа по Bearer токену.
<?php add_action('rest_api_init', function() { /** * Get */ register_rest_route('app/v1', 'get', [ 'methods' => WP_REST_Server::READABLE, 'permission_callback' => function(WP_REST_Request $Request) { if($Request -> get_param('key') != '123qwe') { return new WP_Error('key', 'API KEY is wrong', [ 'status' => 400 ]); } return true; }, 'callback' => function(WP_REST_Request $Request) { $Post = get_post( $Request -> get_param('post_id') ); if(is_a($Post, 'WP_Post')) { return $Post; } return []; }, 'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_id' => [ 'description' => 'Post ID', 'type'=> 'integer', 'required' => true, ], ] ]); });
Разберем наш код немного подробнее. В колбэка ключа “permission_callback” мы выполняем валидацию ключа доступа:
'permission_callback' => function(WP_REST_Request $Request) { if($Request -> get_param('key') != '123qwe') { return new WP_Error('key', 'API KEY is wrong', [ 'status' => 400 ]); } return true; },
Если метод “$Request -> get_param('key')” вернет значение “123qwe”, то валидация пройдет успешно, и WordPress автоматически перейдет к выполнению колбэка анонимной функции ключа “callback”:
'callback' => function(WP_REST_Request $Request) { $Post = get_post( $Request -> get_param('post_id') ); if(is_a($Post, 'WP_Post')) { return $Post; } return []; },
Здесь, по GET переменной “post_id” мы получаем данные поста, выполняем проверку на тип объекта, и если он имеет тип “WP_Post”, то возвращаем (return) данные поста в виде JSON строки. В противном случае - пустой массив, который также преобразуется в пустой JSON массив.
Обратите внимание, что мы немного упростили себе работу, выполнив небольшую валидацию через массив “args”:
'args' => [ 'key' => [ 'description' => 'API KEY', 'type'=> 'string', 'required' => true, ], 'post_id' => [ 'description' => 'Post ID', 'type'=> 'integer', 'required' => true, ], ]
Сделав переменную “key” и “post_id” обязательными к заполнению. А “post_id” кроме всего, должна быть числом.
На этом все.