Внутренние запросы к 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. Поэтому перед обращением к закрытым данным или выполнением изменений нужно явно проверять права пользователя.