Как проверить, нахожусь ли я в admin-ajax.php?
Сейчас для моего плагина я использую in_admin()
, чтобы определить, находится ли пользователь во фронтенде сайта или в административной части. Однако проблема возникает, когда плагины используют admin-ajax.php
для обработки ajax-запросов.
Мне нужен способ регистрировать хуки и плагины только при обработке файла admin-ajax.php
или во фронтенде сайта. Какой лучший способ это сделать?

Проверяйте константу DOING_AJAX
. Её определение — это первый рабочий код в файле wp-admin/admin-ajax.php
. Некоторые очень странные плагины, такие как Jetpack, определяют эту константу в неожиданных местах, поэтому вам также стоит включить проверку is_admin()
.
Пример:
if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
// выполнить действие
}
Я просил более простой способ проверки давным-давно, и это наконец было реализовано в версии 4.7.0.
Так что для WordPress 4.7 и выше можно использовать:
if ( wp_doing_ajax() )
{
// выполнить действие
}

if ( defined( 'DOING_AJAX' ) )
само по себе достаточно. Эта константа устанавливается только в admin-ajax.php
, поэтому проверка значения не требуется.

@JohnReid Это глобальная константа, любой может установить ей любое значение, включая FALSE
.

Хорошее замечание. В ядре WordPress нет мест, где устанавливается это значение, но это не значит, что какой-нибудь недобросовестный плагин не может установить его в false
. Плюс один к вашей карме, сэр!

Это способ, рекомендованный в Codex, но на практике я видел, как люди устанавливают этот флаг в своей теме. Так что это решение хорошо, если вам нужно определить, следует ли вести себя как при AJAX-запросе, но может быть не лучшим, если вам действительно нужно точно знать, является ли запрос AJAX.

Хорошие новости, функция теперь доступна.
Файл: /wp-includes/load.php
1037: /**
1038: * Определяет, является ли текущий запрос Ajax-запросом WordPress.
1039: *
1040: * @since 4.7.0
1041: *
1042: * @return bool True, если это Ajax-запрос WordPress, иначе false.
1043: */
1044: function wp_doing_ajax() {
1045: /**
1046: * Фильтрует, является ли текущий запрос Ajax-запросом WordPress.
1047: *
1048: * @since 4.7.0
1049: *
1050: * @param bool $wp_doing_ajax Является ли текущий запрос Ajax-запросом WordPress.
1051: */
1052: return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }
Напомню, что admin-ajax.php
определяет примерно следующее.
Файл: /wp-admin/admin-ajax.php
11: /**
12: * Выполнение Ajax-процесса.
13: *
14: * @since 2.1.0
15: */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18: define( 'WP_ADMIN', true );
19: }

Решение Fuxias возвращает false
также для AJAX-запросов, сделанных из админ-панели. Однако эти запросы должны возвращать true
, потому что запрашиваемые данные предназначены для админки. Чтобы решить эту проблему, можно использовать следующую функцию:
function saveIsAdmin() {
// AJAX-запросы всегда идентифицируются как запросы из админки,
// поэтому проверим, запрашиваются ли данные для фронтенда или бэкенда
if (wp_doing_ajax()) {
$adminUrl = get_admin_url();
// Если реферер — это URL админки, значит запрашиваем данные для бэкенда
return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
}
// Для не-AJAX запросов просто используем стандартную функцию
return is_admin();
}
