Фильтр rest_pre_dispatch
позволяет изменить ответ REST API запроса еще до его обработки. Это полезный инструмент, который дает возможность перехватить и модифицировать ответ, не доходя до конечного обработчика. Если вернуть непустое значение в фильтре, оно будет использовано как итоговый ответ на запрос.
apply_filters( 'rest_pre_dispatch', mixed $result, WP_REST_Server $server, WP_REST_Request $request )
- $result — любой объект или значение, которое можно использовать для замены стандартного ответа (например,
WP_REST_Response
,WP_Error
,WP_HTTP_Response
). Если вернутьnull
, запрос будет обработан стандартным образом. - $server — экземпляр
WP_REST_Server
, представляющий текущий сервер, обрабатывающий запрос. - $request — объект
WP_REST_Request
, представляющий сам запрос.
Пример 1: Ограничение доступа к определенным маршрутам для неавторизованных пользователей
В этом примере создается фильтр, который ограничивает доступ к маршрутам в пространстве имен /custom/v1
только для авторизованных пользователей. Если пользователь не авторизован, он получит сообщение об ошибке с кодом 403
.
add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) {
if ( strpos( $request->get_route(), '/custom/v1' ) === 0 && ! is_user_logged_in() ) {
return new WP_Error( 'rest_forbidden', 'Вы должны войти в систему для доступа к этому маршруту.', array( 'status' => 403 ) );
}
return $result;
}, 10, 3 );
После добавления этого фильтра, запросы к маршруту /wp-json/custom/v1/*
будут доступны только для авторизованных пользователей. Если пользователь не авторизован, он увидит сообщение об ошибке.
Пример 2: Возврат кастомного ответа для определенного запроса
Следующий пример проверяет, выполняется ли запрос к определенному маршруту (/myplugin/v1/info
) и, если да, возвращает кастомный ответ без обращения к основному обработчику.
add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) {
if ( '/myplugin/v1/info' === $request->get_route() ) {
return rest_ensure_response( array(
'plugin_version' => '1.0.0',
'description' => 'Информация о плагине',
) );
}
return $result;
}, 10, 3 );
В данном случае, при обращении к маршруту /wp-json/myplugin/v1/info
, сервер сразу возвращает массив с информацией о плагине, не вызывая основной обработчик.
Пример 3: Блокировка REST API для всех пользователей, кроме администраторов
Этот фильтр ограничивает доступ ко всем маршрутам REST API для пользователей, не являющихся администраторами. Если пользователь не обладает правами администратора, ему возвращается ошибка 403
.
add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) {
if ( ! current_user_can( 'manage_options' ) ) {
return new WP_Error( 'rest_forbidden', 'Доступ к REST API запрещен для вашей роли.', array( 'status' => 403 ) );
}
return $result;
}, 10, 3 );
После установки этого фильтра только администраторы смогут получать доступ к любым маршрутам REST API. Если пользователь не является администратором, запрос будет возвращать ошибку.
Пример 4: Кэширование ответа для ускорения обработки
Иногда для уменьшения нагрузки на сервер можно использовать кэширование ответов на REST API запросы. В этом примере ответ кэшируется на 60 секунд:
add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) {
if ( $request->get_route() === '/wp/v2/posts' ) {
$cache_key = 'rest_cache_' . md5( serialize( $request->get_params() ) );
$cached_result = get_transient( $cache_key );
if ( $cached_result ) {
return rest_ensure_response( $cached_result );
}
$response = rest_do_request( $request );
set_transient( $cache_key, $response->get_data(), 60 );
return $response;
}
return $result;
}, 10, 3 );
Этот фильтр кэширует ответ на запросы к маршруту /wp/v2/posts
на 60 секунд. Если запрос повторяется в течение этого времени, сервер возвращает кэшированный ответ.
Заключение
Фильтр rest_pre_dispatch
позволяет гибко управлять обработкой запросов к REST API WordPress. Вы можете изменять стандартные ответы, внедрять кэширование и ограничивать доступ к маршрутам в зависимости от требований безопасности и производительности.