Внутренние запросы к WordPress REST API

WordPress REST API можно вызывать не только через HTTP из внешнего приложения или JavaScript, но и напрямую из PHP-кода внутри WordPress.

Такой запрос обрабатывается обычным REST API, но не требует отдельного обращения к серверу по URL.

Зачем это нужно

Для получения записей внутри WordPress обычно используют WP_Query. Но результат его работы отличается от данных, которые возвращает REST API.

Внутренний REST-запрос полезен, когда PHP- и JavaScript-коду нужны данные в одинаковом формате. Например, PHP может получить начальные данные и сразу передать их приложению при загрузке страницы.

Это позволяет:

  • не выполнять дополнительный HTTP-запрос после загрузки страницы.
  • сразу показать данные без промежуточного индикатора загрузки.
  • не загружать WordPress и плагины второй раз ради одного запроса.

Как выполнить внутренний REST-запрос

Создайте объект WP_REST_Request, передайте ему HTTP-метод и маршрут, затем выполните запрос через rest_do_request():

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
$request->set_query_params( [
	'per_page' => 12,
] );

$resp = rest_do_request( $request );
$data = rest_get_server()->response_to_data( $resp, false );
$json = wp_json_encode( $data );

Метод set_query_params() задаёт параметры, которые при обычном HTTP-запросе передаются в строке URL. Названия параметров REST API могут отличаться от аргументов WP_Query. Например, вместо post_status используется status.

Функция rest_do_request() передаёт запрос REST-серверу WordPress и возвращает объект ответа.

Метод response_to_data() преобразует ответ в массив. Второй аргумент определяет, нужно ли добавлять встроенные ресурсы из _embedded:

  • false - не добавлять;
  • true - добавить, если маршрут поддерживает встраивание.

Чтобы получить JSON, передайте массив в wp_json_encode().

Проверка прав

Внутренний вызов не проходит внешнюю HTTP-аутентификацию, но REST API всё равно выполняет permission_callback маршрута в текущем контексте WordPress. Поэтому перед обращением к закрытым данным или выполнением изменений нужно явно проверять права пользователя.