Функция wp_is_jsonp_request()
проверяет, является ли текущий HTTP-запрос JSONP-запросом, который ожидает ответ в формате JSONP. JSONP (JSON with Padding) используется для получения данных с сервера в формате JSON с добавлением функции-обертки, чтобы позволить выполнение кода в контексте браузера.
Функция возвращает true
, если в запросе присутствует параметр _jsonp
, значение которого прошло проверку с помощью wp_check_jsonp_callback()
— встроенной функции WordPress для валидации имен функций. В противном случае она возвращает false
.
wp_is_jsonp_request(): bool
Возвращаемое значение
bool
true
, если запрос является JSONP-запросом и ожидает JSONP-ответ.false
в остальных случаях.
Хуки
rest_jsonp_enabled
Этот фильтр может быть использован для контроля того, разрешены ли JSONP-запросы в WordPress. Можно установить его вfalse
, чтобы полностью отключить JSONP.
Пример 1: Обработка JSONP-запроса с ответом JSONP
В этом примере создадим условие для возврата JSONP-ответа, если текущий запрос является JSONP-запросом.
$data = [ 'status' => 'success', 'message' => 'Запрос выполнен успешно!' ];
if (wp_is_jsonp_request()) {
header('Content-Type: application/javascript; charset=utf-8');
header('X-Content-Type-Options: nosniff');
header('X-Robots-Tag: noindex');
nocache_headers();
$callback = $_GET['_jsonp'];
// Оборачиваем ответ в функцию для предотвращения JSONP Flash атак.
echo '/**/' . $callback . '(' . wp_json_encode($data) . ')';
exit;
} else {
echo wp_json_encode($data);
}
Результат: Если запрос был JSONP, то ответ будет в формате:
/**/callbackName({"status": "success", "message": "Запрос выполнен успешно!"});
Если же запрос был обычным, результатом станет JSON-ответ:
{"status": "success", "message": "Запрос выполнен успешно!"}
Пример 2: Отказ от ответа JSONP при неправильном колбэке
В следующем примере функция проверяет наличие и корректность параметра _jsonp
в запросе. Если параметр указан неверно, сервер не возвращает JSONP-ответ.
$data = [ 'data' => 'Пример данных' ];
if (wp_is_jsonp_request()) {
$callback = $_GET['_jsonp'];
// Проверка корректности колбэка.
if (wp_check_jsonp_callback($callback)) {
header('Content-Type: application/javascript; charset=utf-8');
echo '/**/' . $callback . '(' . wp_json_encode($data) . ')';
} else {
header('HTTP/1.1 400 Bad Request');
echo 'Неверный JSONP колбэк.';
}
} else {
echo wp_json_encode($data);
}
Результат:
- При корректном JSONP-запросе возвращается JSONP-ответ.
- Если колбэк недопустимый или не указан, возвращается ошибка 400 с текстом «Неверный JSONP колбэк.»
Пример 3: Проверка и отключение JSONP через фильтр rest_jsonp_enabled
С помощью фильтра rest_jsonp_enabled
можно отключить JSONP-запросы на сайте, если они не требуются.
add_filter('rest_jsonp_enabled', '__return_false');
$data = [ 'info' => 'Данные только в формате JSON' ];
if (wp_is_jsonp_request()) {
// Этот блок не выполнится, так как JSONP отключен.
header('Content-Type: application/javascript; charset=utf-8');
echo $_GET['_jsonp'] . '(' . wp_json_encode($data) . ')';
} else {
echo wp_json_encode($data);
}
Результат: Даже при наличии параметра _jsonp
в запросе, JSONP-ответ не будет возвращён, так как фильтр rest_jsonp_enabled
отключил JSONP.
Заключение
Функция wp_is_jsonp_request()
— полезный инструмент для обработки JSONP-запросов. Она позволяет интегрировать WordPress с внешними скриптами и API, которые требуют JSONP, но также предоставляет возможности защиты через проверку колбэков и фильтр отключения JSONP.