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

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

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

Solutions Collecting From Web of "Как проверить, есть ли я в admin-ajax.php?"

Проверьте константу DOING_AJAX . Его определение – первый рабочий код в wp-admin/admin-ajax.php . Некоторые очень странные плагины, такие как Jetpack, определяют эту константу в неожиданных местах , поэтому вы можете включить проверку is_admin() .

Пример:

 if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX ) { // do something } 

Я попросил более простой способ проверить это давным-давно, и это было наконец реализовано в 4.7.0.

Поэтому для WP 4.7 и выше вы можете использовать:

 if ( wp_doing_ajax() ) { // do something } 

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

 File: /wp-includes/load.php 1037: /** 1038: * Determines whether the current request is a WordPress Ajax request. 1039: * 1040: * @since 4.7.0 1041: * 1042: * @return bool True if it's a WordPress Ajax request, false otherwise. 1043: */ 1044: function wp_doing_ajax() { 1045: /** 1046: * Filters whether the current request is a WordPress Ajax request. 1047: * 1048: * @since 4.7.0 1049: * 1050: * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request. 1051: */ 1052: return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX ); 1053: } 

Просто для того, чтобы напомнить, admin-ajax.php определяет что-то вроде этого.

 File: /wp-admin/admin-ajax.php 11: /** 12: * Executing Ajax process. 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 , потому что запрашиваемые данные предоставляются для просмотра admin. Чтобы решить эту проблему, вы можете использовать следующую функцию:

 function saveIsAdmin() { //Ajax request are always identified as administrative interface page //so let's check if we are calling the data for the frontend or backend if (wp_doing_ajax() === true) { $adminUrl = get_admin_url(); //If the referer is an admin url we are requesting the data for the backend return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl); } //No ajax request just use the normal function return is_admin(); }