Як перевірити, чи перебуваю я в адмін-ajax.php?


27

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

Мені потрібен спосіб зареєструвати гачки та плагіни лише під час обробки admin-ajax.phpфайлу або у фронтальній частині сайту. Який найкращий спосіб зробити це?

Відповіді:


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, класно. Ця функція - Майкл Джордан з Аякса. Дякую 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();
}

0

DOING_AJAX постійні перевірки, якщо ви знаходитесь admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.