Как было написано в предыдущих статьях 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.
Удачи!