Cum să verifici dacă te afli în admin-ajax.php?

27 oct. 2012, 20:27:15
Vizualizări: 28.7K
Voturi: 35

În prezent, pentru plugin-ul meu, folosesc in_admin() pentru a determina dacă utilizatorul se află în partea frontală a site-ului sau în zona de administrare. Totuși, problema apare când plugin-urile folosesc admin-ajax.php pentru a procesa cererile ajax.

Am nevoie de o modalitate de a înregistra hook-uri și plugin-uri doar când se procesează fișierul admin-ajax.php sau în frontend-ul site-ului. Care este cea mai bună abordare pentru a face acest lucru?

0
Toate răspunsurile la întrebare 4
4
72

Verifică constanta DOING_AJAX. Definiția ei este primul cod funcțional din wp-admin/admin-ajax.php. Unele pluginuri foarte ciudate, cum ar fi Jetpack, definesc această constantă în locuri neașteptate, așa că ai putea include și o verificare pentru is_admin().

Exemplu:

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // fă ceva
}

Am cerut o metodă mai simplă de a verifica asta cu mult timp în urmă, iar aceasta a fost în final implementată în versiunea 4.7.0.

Deci pentru WordPress 4.7 și versiuni mai noi poți folosi:

if ( wp_doing_ajax() )
{
    // fă ceva
}
27 oct. 2012 20:36:56
Comentarii

if ( defined( 'DOING_AJAX' ) ) este suficient de la sine. Constanta este setată doar în admin-ajax.php așa că nu este necesar să verifici o valoare.

John Reid John Reid
26 nov. 2014 15:55:46

@JohnReid Este o constantă globală, oricine o poate seta la orice valoare, inclusiv FALSE.

fuxia fuxia
26 nov. 2014 18:36:50

Bun punct. Nu există nicăieri în nucleul WP care să seteze această valoare, dar presupun că nu înseamnă că un plugin rău intenționat nu ar putea să o seteze la false. Un +1 pentru tine, domnule!

John Reid John Reid
1 dec. 2014 12:32:59

Este metoda recomandată de Codex, dar în practică am văzut oameni care setează acest flag în tema lor, așa că această soluție este bună dacă vrei să știi dacă ar trebui să te comporți ca și cum ar fi o cerere Ajax, dar poate să nu fie cea mai bună dacă chiar trebuie să știi dacă este o cerere Ajax.

Mark Kaplun Mark Kaplun
11 mar. 2016 11:05:27
2

Veste bună, funcția este acum disponibilă.

Fișier: /wp-includes/load.php
1037: /**
1038:  * Determină dacă cererea curentă este o cerere WordPress Ajax.
1039:  *
1040:  * @since 4.7.0
1041:  *
1042:  * @return bool True dacă este o cerere WordPress Ajax, false în caz contrar.
1043:  */
1044: function wp_doing_ajax() {
1045:   /**
1046:    * Filtrează dacă cererea curentă este o cerere WordPress Ajax.
1047:    *
1048:    * @since 4.7.0
1049:    *
1050:    * @param bool $wp_doing_ajax Dacă cererea curentă este o cerere WordPress Ajax.
1051:    */
1052:   return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }

Pentru a recapitula, admin-ajax.php definește ceva de genul acesta.

Fișier: /wp-admin/admin-ajax.php
11: /**
12:  * Execută procesul Ajax.
13:  *
14:  * @since 2.1.0
15:  */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18:     define( 'WP_ADMIN', true );
19: }
15 dec. 2016 02:44:26
Comentarii

Mulțumesc pentru actualizare! Am ratat această informație în notele de lansare pentru versiunea 4.7.

Tom Auger Tom Auger
1 feb. 2017 04:11:59

Hei @TomAuger, tare. Această funcție este un Michael Jordan al ajax-ului. Mulțumesc 23

prosti prosti
1 feb. 2017 16:42:10
0

Soluția Fuxias returnează false și pentru cererile AJAX făcute din panoul de administrare. Dar aceste cereri ar trebui să returneze true, deoarece datele solicitate sunt furnizate pentru o vizualizare administrativă. Pentru a rezolva această problemă puteți folosi următoarea funcție:

function saveIsAdmin() {
    //Cererile AJAX sunt întotdeauna identificate ca fiind pagini ale interfeței administrative
    //așa că verificăm dacă solicităm date pentru frontend sau backend
    if (wp_doing_ajax()) {
        $adminUrl = get_admin_url();
        //Dacă refererul este un URL administrativ, înseamnă că solicităm date pentru backend
        return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
    }

    //Dacă nu este o cerere AJAX, folosim funcția normală
    return is_admin();
}
18 nov. 2017 23:14:49
0

Constanta DOING_AJAX verifică dacă te afli în admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // faci ceva
}
28 aug. 2019 01:07:21