Jak sprawdzić, czy jestem w admin-ajax.php?

27

W tej chwili dla mojej wtyczki używam in_admin()do ustalenia, czy użytkownik znajduje się w interfejsie witryny czy w obszarze administracyjnym. Problem występuje jednak, gdy wtyczki admin-ajax.phpprzetwarzają żądania ajax.

Potrzebuję sposobu, aby zarejestrować haki i wtyczki tylko podczas przetwarzania admin-ajax.phppliku lub w interfejsie witryny. Jak najlepiej to zrobić?

Extrakun
źródło

Odpowiedzi:

61

Sprawdź stałą DOING_AJAX. Jego definicja jest pierwszym działającym kodem w wp-admin/admin-ajax.php. Niektóre bardzo dziwne wtyczki, takie jak Jetpack, definiują tę stałą w nieoczekiwanych miejscach , więc możesz również uwzględnić czek is_admin().

Przykład:

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

I poprosił o prostszym sposobem na sprawdzenie tego dawno temu, a to ostatecznie wdrożone w 4.7.0.

W przypadku wersji WP 4.7 i nowszych możesz użyć:

if ( wp_doing_ajax() )
{
    // do something
}
fuxia
źródło
4
if ( defined( 'DOING_AJAX' ) )sam w sobie wystarcza. Stała jest ustawiana tylko, admin-ajax.phpwięc nie trzeba sprawdzać wartości.
John Reid
5
@JohnReid Jest to globalna stała, każdy może ustawić dowolną wartość, w tym FALSE.
fuxia
Słuszna uwaga. Nigdzie w rdzeniu WP nie ustawiono tej wartości, ale przypuszczam, że nie oznacza to, że niektóre nieuczciwe wtyczki mogą tego nie ustawić false. +1 dla pana!
John Reid,
1
Jest to sposób na kodeks, ale w praktyce widziałem ludzi ustawiających tę flagę w swoim temacie, więc to rozwiązanie jest dobre, jeśli chcesz wiedzieć, czy powinieneś zachowywać się tak, jakby to było ajax, ale może nie być najlepsze, jeśli naprawdę musisz wiedzieć, czy to jest prośba o ajax.
Mark Kaplun,
5

Dobra wiadomość, funkcja jest już dostępna.

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: }

Podsumowując, admin-ajax.phpdefiniuje coś takiego.

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: }
prosti
źródło
Dziękuję za aktualizację! Brakowało mi tego w uwagach do wydania 4.7.
Tom Auger
Hej, TomAuger, spoko. Ta funkcja to Michael Jordan z ajax. Dzięki 23
prosti
1

Rozwiązanie Fuxias zwraca falserównież zapytanie o ajax otrzymane z panelu administracyjnego. Ale te żądania powinny zostać zwrócone true, ponieważ żądane dane są udostępniane do widoku administratora. Aby rozwiązać ten problem, możesz użyć następującej funkcji:

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
źródło
0

DOING_AJAX ciągłe sprawdzanie, czy jesteś w admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
PlanetHackers
źródło