Как в WordPress добавить свой REST API Endpoint

Как в WordPress добавить свой REST API Endpoint

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

Поделиться в соцсетях:
Статьи на похожую тематику

С вашим WordPress сайтом проблемы? нужен дополнительный функционал? нестандартный плагин или сверстать новую страницу?
Тогда напишите мне через форму обратной связи, и я постараюсь вам помочь.

Оставить комментарий

Ваш адрес email не будет опубликован.