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;
}