WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

REST API в WordPress

WordPress REST API (или коротко WP API) позволяет пользователям (HTTP Клиентам) удаленно взаимодействовать с сайтом: отправлять запросы и получать ответы. Ответы приходят в JSON формате. Так, например, можно получить посты, рубрики, комменты сайта и т.д. Кроме того, такие данные можно создавать/изменять/удалять. Делается все это через URL запросы, так называемые «маршруты».

В WordPress, есть готовые маршруты из коробки, но их также можно дополнить, создав свои собственные.

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

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

Все функции связанные с WP REST API

Коротко о 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).

меню

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

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

Как отключить REST API?

На этот вопрос я уже отвечал.

Однако разработчики WordPress настоятельно рекомендует НЕ отключать REST API, потому что это поломает работоспособность WordPress в админке с 5 версии, REST там используется для Блочного редактора контента записи.

Чтобы оставить REST API работоспособным, но при этом закрыть все маршруты от публичного доступа, можно использовать хуки. Тут есть два варианта:

Вариант 1:

# Закрывает все маршруты REST API от публичного доступа
add_filter( 'rest_authentication_errors', function( $result ){

	if( empty( $result ) && ! current_user_can('edit_others_posts') ){
		return new WP_Error( 'rest_forbidden', 'You are not currently logged in.', array( 'status' => 401 ) );
	}

	return $result;
});

Код можно вставить в файл темы functions.php или куда-либо еще.

Этот код разрешает доступ к REST API только для авторизованных пользователей с правами редактора и выше.

Проверку ! current_user_can('edit_others_posts') можно заменить на более подходящую для вашего сайта. Например, её можно упростить и сделать REST API доступным для всех авторизованных пользователей (неважно какие права). Для этого замените проверку на ! is_user_logged_in().

Вариант 2:

Очень похож на первый, но там у нас нет доступа к запросу и классу REST сервера. Сразу же после хука rest_authentication_errors (если проверка пройдена), запускается метод
WP_REST_Server::dispatch() и в его начале срабатывает хук rest_pre_dispatch. Технически это точно такой же хук, на котором можно вернуть WP_Error и любой рест запрос увидит эту ошибку. Т.е. первый вариант мы можем записать следующим кодом, в котором нам будут доступны объект сервера ($rest_server) и объект запроса ($request).

# Закрывает все маршруты REST API от публичного доступа
add_filter( 'rest_pre_dispatch', function( $result, $rest_server, $request ){

	// $request->get_headers()

	// возможно, ошибка аутентификации уже установлена
	if ( empty( $result ) && ! current_user_can('edit_others_posts') ){
		return new WP_Error( 'rest_forbidden', 'Your capability is low.', [ 'status' => 401 ] );
	}

	return $result;
}, 10, 3 );
меню

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

3 коммента
  • Сергей www.shinkareff.ru

    После обновления сайта, в админпанели появилось сообщение «Запрос к REST API неудачен из-за ошибки. Ошибка: [] cURL error 28: Operation timed out after 10001 milliseconds with 0 bytes received»

    Хостер не хочет разбираться, отсылает к разработчикам ВП. Как исправить ошибку? Насколько она критична?

    2
    Ответить18.Июн.2019 в 00:09 #
  • Аналогичная проблема!
    Может кто-то уже находил решение этой проблемы - поделитесь.

    Ответить12.Ноя.2019 в 12:24 #
  • Сергей www.shinkareff.ru

    Нашёл решение. Замена устаревшей темы помогает. Переключил на одну из дефолтных тем и ошибка исчезла.

    Ответить17.Ноя.2019 в 15:04 #
Здравствуйте, !     Войти . Зарегистрироваться