Как проверить, нахожусь ли я в admin-ajax.php?

27 окт. 2012 г., 20:27:15
Просмотры: 28.7K
Голосов: 35

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

Мне нужен способ регистрировать хуки и плагины только при обработке файла admin-ajax.php или во фронтенде сайта. Какой лучший способ это сделать?

0
Все ответы на вопрос 4
4
72

Проверяйте константу 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() )
{
    // выполнить действие
}
27 окт. 2012 г. 20:36:56
Комментарии

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

John Reid John Reid
26 нояб. 2014 г. 15:55:46

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

fuxia fuxia
26 нояб. 2014 г. 18:36:50

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

John Reid John Reid
1 дек. 2014 г. 12:32:59

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

Mark Kaplun Mark Kaplun
11 мар. 2016 г. 11:05:27
2

Хорошие новости, функция теперь доступна.

Файл: /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: }
15 дек. 2016 г. 02:44:26
Комментарии

Спасибо за обновление! Я пропустил этот момент в заметках о релизе 4.7.

Tom Auger Tom Auger
1 февр. 2017 г. 04:11:59

Привет @TomAuger, круто. Эта функция - настоящий Майкл Джордан в мире ajax. Спасибо 23

prosti prosti
1 февр. 2017 г. 16:42:10
0

Решение 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();
}
18 нояб. 2017 г. 23:14:49
0

Константа DOING_AJAX проверяет, находитесь ли вы в файле admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // выполнить какое-либо действие
}
28 авг. 2019 г. 01:07:21