Хук pre_http_request
в WordPress позволяет прерывать выполнение HTTP-запросов, если возвращаемое значение отличается от false
. С его помощью можно настроить условные фильтры для предотвращения отправки нежелательных запросов или возврата заранее определённых данных вместо выполнения запроса. Это особенно полезно для оптимизации сайта, ограничения запросов к сторонним API или блокировки определённых запросов от плагинов.
apply_filters( 'pre_http_request', false|array|WP_Error $response, array $parsed_args, string $url );
Параметры
- $response (false|array|WP_Error) — Предварительное значение, возвращаемое для HTTP-запроса. Если возвращено
false
, запрос выполняется стандартно. Любое другое значение прерывает запрос. - $parsed_args (array) — Аргументы HTTP-запроса, такие как метод, заголовки и другие настройки.
- $url (string) — URL-адрес, к которому выполняется запрос.
Использование
Для использования хука pre_http_request
, добавьте фильтр с обработчиком, который проверяет условия и определяет, следует ли прерывать выполнение запроса.
add_filter( 'pre_http_request', 'custom_pre_http_request_handler', 10, 3 );
/**
* Обработчик хука `pre_http_request`.
*
* @param false|array|WP_Error $response Предварительное значение для HTTP-запроса.
* @param array $parsed_args Аргументы запроса.
* @param string $url URL запроса.
*
* @return false|array|WP_Error
*/
function custom_pre_http_request_handler( $response, $parsed_args, $url ) {
// Условия для фильтрации HTTP-запросов
return $response;
}
Пример 1: Блокировка HTTP-запросов к определённому домену
Некоторые плагины отправляют запросы на свои серверы для проверки обновлений, что может замедлять сайт. Следующий код блокирует такие запросы, возвращая сообщение об ошибке.
add_filter( 'pre_http_request', 'block_external_requests', 10, 3 );
function block_external_requests( $response, $parsed_args, $url ) {
if ( strpos( $url, 'api.example.com' ) !== false ) {
return new WP_Error( 'http_request_blocked', __( 'Запрос к этому домену заблокирован.', 'textdomain' ) );
}
return $response;
}
Пример 2: Возвращение заранее подготовленного ответа
Если необходимо заменить результат запроса определёнными данными (например, для тестирования), можно вернуть заранее подготовленный массив вместо выполнения запроса:
add_filter( 'pre_http_request', 'mock_http_response', 10, 3 );
function mock_http_response( $response, $parsed_args, $url ) {
if ( strpos( $url, 'test-api.example.com' ) !== false ) {
return [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => json_encode( [ 'status' => 'ok', 'message' => 'Запрос замещён.' ] ),
'response' => [ 'code' => 200, 'message' => 'OK' ],
'cookies' => [],
];
}
return $response;
}
Пример 3: Отключение запросов для определённых страниц сайта
Допустим, что нам нужно блокировать запросы на внешние API на административных страницах, кроме страниц обновлений и управления плагинами.
add_filter( 'pre_http_request', 'disable_http_requests_on_admin_pages', 10, 3 );
function disable_http_requests_on_admin_pages( $response, $parsed_args, $url ) {
global $pagenow;
if ( is_admin() && ! in_array( $pagenow, [ 'update-core.php', 'plugins.php' ] ) ) {
return [
'headers' => [],
'body' => '',
'response' => [ 'code' => 403, 'message' => 'Запрос запрещён на административных страницах' ],
'cookies' => [],
];
}
return $response;
}
Пример 4: Ограничение количества запросов к внешнему API
Для предотвращения перегрузки стороннего API можно установить ограничение на количество запросов, используя этот хук.
add_filter( 'pre_http_request', 'limit_external_api_requests', 10, 3 );
function limit_external_api_requests( $response, $parsed_args, $url ) {
if ( strpos( $url, 'api.external-service.com' ) !== false ) {
$request_count = get_transient( 'external_api_request_count' ) ?: 0;
if ( $request_count >= 5 ) {
return new WP_Error( 'too_many_requests', __( 'Превышено количество запросов к API.', 'textdomain' ) );
}
set_transient( 'external_api_request_count', $request_count + 1, HOUR_IN_SECONDS );
}
return $response;
}
Заключение
Хук pre_http_request
предоставляет гибкие возможности для управления HTTP-запросами в WordPress, помогая разработчикам оптимизировать работу сайта и контролировать доступ к внешним API.