WordPress как на ладони
rgbcode is looking for WordPress developers. Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

REST API

WordPress REST API (или коротко WP API) позволяет пользователям (HTTP Клиентам) удаленно управлять сайтом, например получать/создавать посты, элементы таксономии, юзеров, комментарии и т.д. Делается все это через обычные HTTP запросы, так называемые «маршруты».
В ответ на запрос всегда возвращается JSON объект с данными.

REST API полноценно был добавлен в ядро WordPress в версии 4.7.

Коротко о REST API (WP API)

WordPress REST API (далее просто REST API или WP API) разработан на базе технологии REST, чтобы иметь понятные URL-адреса и использовать коды HTTP ответов для указания успехов или ошибок. Использует встроенные функции HTTP, такие как http-аутентификация и http-команды (GET, POST), которые могут быть поняты многими HTTP-клиентами. WP API позволяет удобно и безопасно работать с WordPress из клиентского приложения.

REST API:

  • Предоставляет структурированный, расширяемый и простой способ получить или передать данные в WordPress.

  • Использует json в качестве формата запроса и ответа, включая ответы на ошибки.

  • Предоставляет разные данные: публичные и приватные (доступны только после аутентификации). После аутентификации rest API позволяет управлять контентом сайта.

  • Позволяет работать с любым языком программирования, который может обрабатывать HTTP-запросы и интерпретировать JSON, например Node.js или Java.

  • Позволяет создать новые способы управления сайтом. К примеру, можно создать плагин, позволяющий администрировать сайт, или создать совершенно новый интерактивный интерфейс во фронэнде.

  • Может заменить способ обработки ajax запросов. Смотрите: admin-ajax API.

При всей своей простоте, REST API может показаться сложным, поэтому изучение этой темы будет разбито на логические части, так будет проще освоить материал. В основном сложность заключается в новой терминологии — это всякие там ресурсы, эндпоинты, маршруты. Они нужны для создания и применения стандартов, но для понимания того, как это работает все эти вещи совсем не обязательны.

Для понимания работы REST API достаточно:

  • Изучить всего одну функцию register_rest_route().
  • Ознакомится с маршрутами WP.
  • И научится пользоваться любым Клиентом для общения с WP API, например Postman.

Создание маршрута

В WordPress, есть готовые маршруты. А также можно создавать свои собственные, для этого нужно использовать функцию register_rest_route().

Давайте создадим свой маршрут.

// создание маршрута
add_action( 'rest_api_init', function(){

	// пространство имен
	$namespace = 'myplugin/v1';

	// маршрут
	$route = '/author-posts/(?P<id>\d+)';

	// параметры конечной точки (маршрута)
	$route_params = [
		'methods'  => 'GET',
		'callback' => 'my_awesome_func',
		'args'     => [
			'arg_str' => [
				'type'     => 'string', // значение параметра должно быть строкой
				'required' => true,     // параметр обязательный
			],
			'arg_int' => [
				'type'    => 'integer', // значение параметра должно быть числом
				'default' => 10,        // значение по умолчанию = 10
			],
		],
		'permission_callback' => function( $request ){
			// только авторизованный юзер имеет доступ к эндпоинту
			return is_user_logged_in();
		},
	];

	register_rest_route( $namespace, $route, $route_params );

} );

// функция обработчик конечной точки (маршрута)
function my_awesome_func( WP_REST_Request $request ){

	$posts = get_posts( [
		'author' => (int) $request['id'],
	] );

	if ( empty( $posts ) ) {
		return new WP_Error( 'no_author_posts', 'Записей не найдено', [ 'status' => 404 ] );
	}

	return $posts;
}

Теперь пройдя по ссылке http://example.com/wp-json/myplugin/v1/author-posts/1 мы увидим JSON ответ, который вернула наша функция my_awesome_func().

Пояснения к коду:

  • Маршрут нужно регистрировать именно на хуке rest_api_init, чтобы не выполнять никаких операций, если REST API отключен.

  • Почему пространства имен называется именно myplugin/v1, читайте здесь.

  • Маршрут /author-posts/(?P<id>\d+) указан как регулярное выражение для определения числа, чтобы по URL /author-posts/123 нам выдавались посты автора с ID 123.

  • GET запрос на URL http://example.com/wp-json/myplugin/v1/author-posts/1 - это конечная точка, которую мы описали при регистрации маршрута.

    Маршрут может иметь несколько конечных точек, и для каждой конечной точки можно указать разные параметры:

    • methods — HTTP методы по которым нужно обращаться к конечной точке
    • callback — функцию обратного вызова для ответа на запрос
    • permission_callback — функцию обратного вызова для проверки права доступа к конечной точке.
    • args — параметры запроса, которые можно передать конечной точке. Каждый параметр описывается в виде элемента массива. Для каждого параметра можно указать свои опции, например, обязательный ли это параметр (required) или значение параметра по умолчанию (default), функцию проверки значения параметра (validate_callback). Подробнее читайте в разделе Типы параметров.

Подробнее про создание маршрутов читайте в разделе Создание Маршрута

Ключевые понятия REST API

Смотрите в разделе Базовые знания REST API.

Нужно разобраться в каждом понятии, чтобы понимать что написано и о чем идет речь в этом руководстве!

Как узнать является ли текущий запрос REST запросом

Для этого можно проверить наличие константы REST_REQUEST:

if( defined('REST_REQUEST') ){
	// Это рест запрос
}

ВАЖНО! Эта константа объявляется довольно поздно на хуке parse_request (порядок хуков см. здесь), поэтому до этого хука нет возможности понять rest запрос это или нет.

Единственный вариант сделать это до этого хука - это написать кастомную проверку, в которой проверить, например, текущий URI:

if( rest_get_url_prefix() === explode( '/', $_SERVER['REQUEST_URI'] )[1] ?? '' ){
	// this is rest request
}

Подробнее об этапах загрузки REST читайте здесь.

SDK на PHP для удобной работы с WordPress REST API

https://github.com/madeITBelgium/WordPress-PHP-SDK

Библиотека устанавливается через composer. Пример использования:

use MadeITBelgium\WordPress\WordPressFacade as WP;

$users  = WP::post()->list();               // список постов
$result = WP::post()->create( $data );      // создать новый пост
$user   = WP::post()->get( $id );           // запись по ID
$result = WP::post()->update( $id, $data ); // обновить запись
$result = WP::post()->delete( $id );        // удалить запись

Полезные ссылки

--

Этот раздел создавался на базе официального руководства: REST API Handbook (англ). Однако тут мы по возможности упрощаем/уточняем/дорабатываем/реструктурируем контент, приводим примеры и в итоге стараемся подать информацию более понятно.

12 комментариев
    Войти