REST API на WordPress
Пример скрипта:
add_action('rest_api_init', 'fn_rest_api_init');
function fn_rest_api_init()
{
// http://exemple.ru/wp-json/api-custom/v1/test
register_rest_route( 'api-custom/v1', '/test', [
'methods' => \WP_REST_Server::READABLE, // GET
'callback' => 'fn_rest_api_test',
]);
}
function fn_rest_api_test(WP_REST_Request $request)
{
$return = [
'status' => 'ok'
];
return rest_ensure_response($return);
}
register_rest_route() — описание
Шаблон использования:
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/my_slug/(?P<param_name>.+)', array(
'methods' => 'GET', // метод запроса: GET, POST ...
'callback' => 'function_name', // функция обработки запроса. Должна вернуть ответ на запрос
'permission_callback' => 'function_name', // функция проверки доступа к маршруту. Должна вернуть true/false
// описание передаваемых параметров
'args' => array(
'param_name' => array(
'default' => null, // значение параметра по умолчанию
'required' => null, // является ли параметр обязательным. Может быть только true
'validate_callback' => 'function_name', // функция проверки значения параметра. Должна вернуть true/false
'sanitize_callback' => 'function_name', // функция очистки значения параметра. Должна вернуть очищенное значение
),
'param_name2' => array(
...
)
...
),
) );
} );
register_rest_route( $namespace, $route, $args, $override );
$namespace — Первая часть маршрута (URL), которая идет после REST префикса (/wp-json/)
Пример: ‘plugin-name/v1‘
$route — Вторая часть маршрута (URL). Поддерживает регулярные выражения
Пример: ‘/author/(?P<id>\d+)‘
$args — Массив параметров для конечной точки
Массив для одной конечной точки:
$args = [
'methods' => 'GET',
'callback' => null,
'permission_callback' => null,
'args' => array(),
];
Пример как можно указать несколько конечных точек (методов):
$args = [
// common args
'args' => [
'id' => [
'description' => __( 'Unique identifier for the term.' ),
'type' => 'integer',
],
],
// GET
[
'methods' => 'GET',
'callback' => null,
'permission_callback' => null,
'args' => [],
],
// POST
[
'methods' => 'POST',
'callback' => null,
'permission_callback' => null,
'args' => [],
],
]
$override — Определяет нужно ли переписать данные, если такой маршрут уже существует
-
- true — переопределить
- false — объединить с помощью функции array_merge()
По умолчанию: false
Константы для определения метода запроса:
WP_REST_Server::READABLE // GET
WP_REST_Server::CREATABLE // POST
WP_REST_Server::EDITABLE // POST, PUT, PATCH
WP_REST_Server::DELETABLE // DELETE
WP_REST_Server::ALLMETHODS // GET, POST, PUT, PATCH, DELETE
Пример получения информации о запросе:
// Регистрирует маршрут
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/author/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'my_rest_api_func',
) );
} );
// Обратимся по адресу http://wp-test.ru/wp-json/myplugin/v1/author/1
function my_rest_api_func( WP_REST_Request $request ) {
// Можно получить доступ к параметрам через прямой доступ к массиву объекта:
$param = $request['id']; // 1
// Или с помощью метода:
$param = $request->get_param( 'id' ); // 1
// Массив из всех параметров
$parameters = $request->get_params(); // Array([id] => 1)
// При необходимости также доступны отдельные параметры параметров:
$parameters = $request->get_url_params(); // Array([id] => 1)
$parameters = $request->get_query_params(); // Array()
// Если запросить http://wp-test.ru/wp-json/myplugin/v1/author/1?post=1
$parameters = $request->get_query_params(); // Array( [post] => 1 )
$parameters = $request->get_body_params(); // Array()
$parameters = $request->get_json_params(); // null - не было запроса с заголовком Content-type: application/json
$parameters = $request->get_default_params(); // Array()
// Данные о загрузках не объединены, но могут быть доступны отдельно:
$parameters = $request->get_file_params();
// Получение тела не обработанное толо запроса:
$body_raw = $request->get_body();
// Если предполагается, что в теле запроса будет JSON, то получаем данные в виде массива:
$body_json = $request->get_json_params();
// варианты возврата данных
return new WP_REST_Response( true, 200 );
return new WP_Error( 'no_author', 'Invalid author', array( 'status' => 404 ) );
return 'строка';
return array( 'foo'=>'bar' );
// получим объект WP_REST_Response
$response = rest_ensure_response( array( 'foo'=>'bar' ) );
$response->set_status( 401 );
$response->set_headers( [
'X_REAL_IP' => '54.15.124.126',
] );
return $response;
}
Получение записей указанного автора
// пример запроса на получение записей автора под ID = 1
// http://example.ru/wp-json/myplugin/v1/author/1
// Регистрирует маршрут
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/author/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'my_awesome_func',
) );
} );
// Обрабатывает запрос
function my_awesome_func( WP_REST_Request $request ) {
$posts = get_posts( array(
'author' => (int) $request['id'],
) );
if ( empty( $posts ) )
return new WP_Error( 'no_author_posts', 'Записей не найдено', array( 'status' => 404 ) );
return $posts;
}