rest_post_dispatch │ хук-фильтр │ WP 4.4.0

Позволяет изменить ответ REST API после выполнения обработчика маршрута, но до отправки ответа клиенту.

Через фильтр можно изменить данные, HTTP-статус и заголовки ответа.

Фильтр также применяется к внутренним запросам для предварительной загрузки данных, встроенным ресурсам _embed и отдельным запросам внутри /batch/v1.

Фильтр может вызываться несколько раз в рамках одного HTTP-запроса. Проверяйте маршрут и метод запроса перед изменением ответа.

Для добавления постоянного поля к объектам REST API используйте register_rest_field(). Функция добавляет поле в схему объекта и корректно работает с параметром _fields.

Использование

add_filter( 'rest_post_dispatch', 'wp_kama_rest_post_dispatch_filter', 10, 3 );

/**
 * Function for `rest_post_dispatch` filter-hook.
 * 
 * @param WP_HTTP_Response $result  Result to send to the client. Usually a `WP_REST_Response`.
 * @param WP_REST_Server   $server  Server instance.
 * @param WP_REST_Request  $request Request used to generate the response.
 *
 * @return WP_HTTP_Response
 */
function wp_kama_rest_post_dispatch_filter( $result, $server, $request ){
	// filter...
	return $result;
}
$result(WP_HTTP_Response)
Ответ, который будет отправлен клиенту. Обычно объект WP_REST_Response{}.
$server(WP_REST_Server)
Текущий экземпляр REST-сервера.
$request(WP_REST_Request)
Запрос, для которого сформирован ответ. Позволяет получить маршрут, HTTP-метод и параметры запроса.

Примеры

#1 Добавление данных в ответ пользовательского маршрута

Добавим время формирования ответа маршрута /my-plugin/v1/status.

add_filter( 'rest_post_dispatch', 'wp_kama_add_generated_time', 10, 3 );

function wp_kama_add_generated_time( $result, $server, $request ) {
	if (
		'/my-plugin/v1/status' !== $request->get_route()
		|| 'GET' !== $request->get_method()
	) {
		return $result;
	}

	$data = $result->get_data();

	if ( is_array( $data ) ) {
		$data['generated_at'] = gmdate( 'c' );
		$result->set_data( $data );
	}

	return $result;
}

Список изменений

С версии 4.4.0 Введена.
С версии 4.5.0 Applied to embedded responses.

Где вызывается хук

WP_REST_Server::serve_request()
rest_post_dispatch
rest_preload_api_request()
rest_post_dispatch
WP_REST_Server::embed_links()
rest_post_dispatch
WP_REST_Server::serve_batch_request_v1()
rest_post_dispatch
wp-includes/rest-api/class-wp-rest-server.php 464
$result = apply_filters( 'rest_post_dispatch', rest_ensure_response( $result ), $this, $request );
wp-includes/rest-api.php 3033
$response = apply_filters( 'rest_post_dispatch', rest_ensure_response( $response ), $server, $request );
wp-includes/rest-api/class-wp-rest-server.php 824
$response = apply_filters( 'rest_post_dispatch', rest_ensure_response( $response ), $this, $request );
wp-includes/rest-api/class-wp-rest-server.php 1894
$result = apply_filters( 'rest_post_dispatch', rest_ensure_response( $result ), $this, $single_request );

Где используется хук в WordPress

wp-includes/connectors.php 753
add_filter( 'rest_post_dispatch', '_wp_connectors_rest_settings_dispatch', 10, 3 );
wp-includes/rest-api.php 253
add_filter( 'rest_post_dispatch', 'rest_send_allow_header', 10, 3 );
wp-includes/rest-api.php 254
add_filter( 'rest_post_dispatch', 'rest_filter_response_fields', 10, 3 );