Вирішив трохи ускладнити наш попередній код, додавши до нього просту перевірку доступу за 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”, до всього іншого, повинен бути числом.
На цьому все.
