Як завантажується 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() , робить наступні дії по порядку:

  1. Викликає WP::init() .

    Цей метод визначає поточного користувача для звичайних (не REST) ​​запитів. див. wp_get_current_user() .

    Пізніше (якщо це REST запит), на хуку аутентифікації rest_authentication_errors авторизований користувач буде обнулений при неправильному коді nonce. Дивіться:

  2. Викликає WP::parse_request() .

    Цей метод визначає параметри поточного запиту $wp->query_vars .

  3. Запуск 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 (логіка обробки запиту для звичайних сторінок тут закінчується).

    1. Встановлюється константа define( 'REST_REQUEST', true ).
    2. Запускається сервер REST rest_get_server() .

      При запуску спрацьовує хук rest_api_init . На ньому до наявного сервера додаються свої маршрути.

    3. Обробляється запит REST WP_REST_Server::serve_request( $route ) .

      При обробці запиту перевіряється доступність поточного маршруту, маршрут обробляється, повертається відповідь сервера REST у вигляді об’єкта WP_REST_Response .

      При обробці запиту спрацьовують наступні корисні хуки (у вказаному порядку):

    4. Робота 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 сервер, також він робить відповідний запит у БД або будь-що ще.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *