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

27

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

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

Extrakun
источник

Ответы:

61

Проверьте постоянную 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
}
Фуксия
источник
4
if ( defined( 'DOING_AJAX' ) )достаточно само по себе. Константа только установлена, admin-ajax.phpпоэтому вам не нужно проверять значение.
Джон Рейд
5
@JohnReid Это глобальная константа, любой может установить любое значение, в том числе FALSE.
fuxia
Хорошая точка зрения. В ядре WP нигде нет такого значения, но я полагаю, что это не означает, что какой-то мошеннический плагин может не установить его falseвместо этого. +1 для вас, сэр!
Джон Рид
1
Это кодекс, но на практике я видел людей, устанавливающих этот флаг в своей теме, так что это решение хорошо, если вы хотите знать, следует ли вам вести себя так, как будто это ajax, но может быть не лучшим, если вам действительно нужно знать, это запрос AJAX.
Марк Каплун
5

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

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: }
прости
источник
Спасибо за обновление! Я пропустил это в примечаниях к выпуску 4.7.
Том Ожер
Привет @ TomAuger, круто. Эта функция - Майкл Джордан из ajax. Благодаря 23
прости
1

Решение Fuxias возвращается falseтакже для запроса AJAX, сделанного из панели администратора. Но эти запросы должны возвращаться true, потому что запрашиваемые вами данные предоставляются для просмотра администратором. Для решения этой проблемы вы можете использовать следующую функцию:

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()) {
        $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();
}
GM_Alex
источник
0

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

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
PlanetHackers
источник