Как проверить, нахожусь ли я в 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, поэтому проверка значения не требуется.
John Reid
@JohnReid Это глобальная константа, любой может установить ей любое значение, включая FALSE.
fuxia
Хорошее замечание. В ядре WordPress нет мест, где устанавливается это значение, но это не значит, что какой-нибудь недобросовестный плагин не может установить его в false. Плюс один к вашей карме, сэр!
John Reid
Это способ, рекомендованный в Codex, но на практике я видел, как люди устанавливают этот флаг в своей теме. Так что это решение хорошо, если вам нужно определить, следует ли вести себя как при AJAX-запросе, но может быть не лучшим, если вам действительно нужно точно знать, является ли запрос AJAX.
Mark Kaplun
Хорошие новости, функция теперь доступна.
Файл: /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();
}