Cum să verifici dacă te afli în admin-ajax.php?
Î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?

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
}

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.

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

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!

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.

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

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();
}
