Як завантажується REST у WordPress
REST запит на 90% обробляється як і запит для фронтенда. Його також починає обробляти файл index.php . Через правила перезапису (ЧПУ) встановлюється параметр запиту rest_route=маршрут
.
^wp-json/?$ => index.php?rest_route=/ ^wp-json/(.*)? => index.php?rest_route=/$matches[1]
Процес завантаження REST запиту виглядає так:
index.php // визначається константа WP_USE_THEMES wp-blog-header.php // ЯДРО (описано тут https://wp-doc.com/handbook/wordpress/loading#wpcore-load) require_once dirname(__FILE__) . '/wp-load.php'; // У процесі завантаження ядра створюється хук parse_request // який спрацьовує у функції `wp()` add_action( 'parse_request', 'rest_api_loaded'); // Встановлення основного запиту WordPress. // Робить запит та визначає яка сторінка завантажується. // У момент спрацьовування хука parse_request управління передається // Функції rest_api_loaded(), яка перериває PHP через die. // Див. https://wp-doc.com/function/wp wp(); // Див WP::main()
Пояснення до роботи wp() та хуку parse_request
Функція WP::main() , робить наступні дії по порядку:
- Викликає WP::init() .
Цей метод визначає поточного користувача для звичайних (не REST) запитів. див. wp_get_current_user() .
Пізніше (якщо це REST запит), на хуку аутентифікації rest_authentication_errors авторизований користувач буде обнулений при неправильному коді nonce. Дивіться:
- Викликає WP::parse_request() .
Цей метод визначає параметри поточного запиту $wp->query_vars .
- Запуск REST – rest_api_loaded() .
Наприкінці WP::parse_request() спрацьовує хук rest_api_loaded() :
add_action( 'parse_request', 'rest_api_loaded');
rest_api_loaded() перевіряє параметр запиту
$GLOBALS['wp']->query_vars['rest_route']
. Якщо це запит REST, то запускається логіка REST (логіка обробки запиту для звичайних сторінок тут закінчується).- Встановлюється константа
define( 'REST_REQUEST', true )
. - Запускається сервер REST rest_get_server() .
При запуску спрацьовує хук rest_api_init . На ньому до наявного сервера додаються свої маршрути.
- Обробляється запит REST WP_REST_Server::serve_request( $route ) .
При обробці запиту перевіряється доступність поточного маршруту, маршрут обробляється, повертається відповідь сервера REST у вигляді об’єкта WP_REST_Response .
При обробці запиту спрацьовують наступні корисні хуки (у вказаному порядку):
- Робота PHP переривається через die() .
- Встановлюється константа
Таким чином
За обробку запиту REST відповідає функція rest_api_loaded() .
REST запит виглядає так само як звичайний фронтенд запит. До моменту встановлення основного запиту WordPress функцією wp() . У ній як і в стандартному фронтенд запиті встановлюється поточний користувач. Але:
- Не встановлюються заголовки WP::send_headers() .
- НЕ відбувається основний запит WP::query_posts() .
- НЕ обробляється 404 сторінка WP::handle_404() .
- НЕ викликається файл template-loader.php , який визначає шаблон сторінки.
- НЕ працює хук редиректів template_redirect .
Заголовки REST відповіді ставить REST сервер, також він робить відповідний запит у БД або будь-що ще.