Как было написано в предыдущих статьях WP имеет богатый ф-л из коробки для работы с его API. Сегодня мы рассмотрим код создания своего endpoint`а для считывания данных.
Для минимальной реализации своего API в вордпрессе, нам понадобится экшин “rest_api_init” и функция “register_rest_route”.
Вначале весь код:
add_action('rest_api_init', function()
{
/**
* Read
*/
register_rest_route('app/v1', 'read', [
'methods' => WP_REST_Server::READABLE,
'permission_callback' => function(WP_REST_Request $Request)
{
//Sets
$test_string = $Request -> get_param('test_string');
if(empty( $test_string ))
{
return new WP_Error('test_string', 'Field test_string is required', [
'status' => 400
]);
}
return true;
},
'callback' => function(WP_REST_Request $Request)
{
$test_string = $Request -> get_param('test_string');
$test_integer = $Request -> get_param('test_integer');
$test_enum = $Request -> get_param('test_enum');
$test_array_integer = $Request -> get_param('test_array_integer');
return [
'test_string' => $test_string,
'test_integer' => $test_integer,
'test_enum' => $test_enum,
'test_array_integer' => $test_array_integer,
];
},
'args' => [
'test_string' => [
'description' => 'Some test string',
'type'=> 'string',
],
'test_integer' => [
'description' => 'Some test integer',
'type'=> 'integer',
'sanitize_callback' => 'absint',
],
'test_enum' => [
'description' => 'Some test enum',
'type' => 'string',
'enum' => ['yes', 'no'],
'required' => true,
],
'test_array_integer' => [
'description' => 'Some test array integer',
'type' => 'array',
'items' => [
'type' => 'integer',
],
'default' => [],
],
]
]);
});Как вы наверное догадались, для работы с каким либо АПИ WP нам необходимо обернуть наш код в хук:
add_action('rest_api_init', function()
{
/**
* API code here
*/
});Ядром нашего текущего кода является core ф-я wp “register_rest_route”, которая собственно и обеспечивает реализации нашего ендпоинта. На входе, ф-я принимает четыре параметра:
$namespace - первая часть вашего URL маршрута.
$route - вторая часть вашего маршрута, которая также может использовать регулярные выражения.
$args - массив параметров для конечной точки.
$override - определяет, нужно ли перезаписывать данные если такой же маршрут уже существует.
Давайте детальнее рассмотрим третий параметр ($args). В нашем примере, мы используем четыре ключа:
methods - определяет тип/метод запрос (GET, POST, PUT, DELETE). В примере используется константа WP.
permission_callback - калбэк ф-я, вызываемая до ф-и в ключе “callback”, и используется для различных проверок (пример: является ли пользователь автором поста, если посту планируется удалять)
callback - калбэк ф-я, реализующая главный ф-л нашего endpoint. Т.е. в нем сосредоточена основная логика кода (к примеру, получение данных из БД определенного пользователя)
args - массив аргументов используемых в endpoint, здесь определяются фильтры, правила валидации и допустимые значения для переменных запроса.
К примеру в “permission_callback” мы можем использовать свои правила валидации:
'permission_callback' => function(WP_REST_Request $Request)
{
//Sets
$test_string = $Request -> get_param('test_string');
if(empty( $test_string ))
{
return new WP_Error('test_string', 'Field test_string is required', [
'status' => 400
]);
}
return true;
},в коде выше, мы проверяем, имеет ли переменная $test_string какое либо значение. Если пустая, то возвращает ошибку, и наш АПИ прерывает свою работу.
В “callback”, мы просто возвращаем данные GET запроса, хотя можем выполнить любую другую логику:
'callback' => function(WP_REST_Request $Request)
{
$test_string = $Request -> get_param('test_string');
$test_integer = $Request -> get_param('test_integer');
$test_enum = $Request -> get_param('test_enum');
$test_array_integer = $Request -> get_param('test_array_integer');
return [
'test_string' => $test_string,
'test_integer' => $test_integer,
'test_enum' => $test_enum,
'test_array_integer' => $test_array_integer,
];
},В под ключом “args”, должны быть сосредоточены все GET/POST переменные которые мы планируем использовать в нашем коде:
'args' => [ 'test_string' => [ 'description' => 'Some test string', 'type'=> 'string', ], 'test_integer' => [ 'description' => 'Some test integer', 'type'=> 'integer', 'sanitize_callback' => 'absint', ], 'test_enum' => [ 'description' => 'Some test enum', 'type' => 'string', 'enum' => ['yes', 'no'], 'required' => true, ], 'test_array_integer' => [ 'description' => 'Some test array integer', 'type' => 'array', 'items' => [ 'type' => 'integer', ], 'default' => [], ], ]
Но как не странно через:
$Request -> get_param('test_xxx');мы можем обратиться и к любой другой переменной не объявленной в ключе “args”. Но обратившись, такая переменная не будет пропущена через фильтр и не будет валидирована.
Как видите, создать свой Endpoint в WordPress довольно просто, особенно если заглядывать в документацию и смотреть исходный код WP.
Удачи!
