Иногда нужно знать прямо внутри функции — это обычный запрос страницы или AJAX-вызов? Функция wp_doing_ajax() отвечает именно на этот вопрос: возвращает true, если в данный момент выполняется AJAX-запрос, и false в противном случае.
Параметров у функции нет — просто вызываешь и проверяешь результат.
До WordPress 4.7: как это делали раньше
До версии 4.7 для той же проверки использовали константу DOING_AJAX:
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
// AJAX-запрос
}
Сейчас это считается устаревшим подходом. Функция wp_doing_ajax() чище, короче и поддерживает фильтры.
Базовый пример использования
if ( wp_doing_ajax() ) {
// выполняется AJAX-запрос
} else {
// обычный запрос страницы
}
Пример: одна функция для AJAX и обычного запроса
Удобный паттерн — написать функцию, которая работает в обоих режимах и сама выбирает формат ответа:
function true_function() {
/* выполняем нужный код */
$return_data = array( 'success' => true );
if ( wp_doing_ajax() ) {
wp_send_json_success( $return_data );
} else {
return $return_data;
}
}
При AJAX-запросе функция отправит JSON-ответ и завершит выполнение. При обычном запросе — просто вернёт массив.
Фильтр wp_doing_ajax
Внутри функция использует фильтр, через который можно изменить её поведение:
add_filter( 'wp_doing_ajax', 'true_change_wp_doing_ajax_behavior', 25 );
function true_change_wp_doing_ajax_behavior( $is_ajax ) {
if ( /* условие */ ) {
$is_ajax = true;
}
return $is_ajax;
}
Это полезно, например, когда нужно принудительно считать запрос AJAX-запросом при определённых условиях — без реального AJAX-вызова.