Як перевірити, чи перебуваю я в адмін-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.