Иногда нужно знать прямо внутри функции — это обычный запрос страницы или 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-вызова.

 

Разработка сайтов на Wordpress