Come verificare se mi trovo in admin-ajax.php?
Al momento per il mio plugin, sto usando in_admin()
per determinare se l'utente si trova nel frontend del sito o nell'area amministrativa. Tuttavia, il problema si verifica quando i plugin utilizzano admin-ajax.php
per elaborare le richieste ajax.
Ho bisogno di un modo per registrare hook e plugin solo quando si elabora il file admin-ajax.php
o nel frontend del sito. Qual è il modo migliore per farlo?

Controlla la costante DOING_AJAX
. La sua definizione è il primo codice funzionante in wp-admin/admin-ajax.php
. Alcuni plugin molto strani, come Jetpack, definiscono questa costante in luoghi inaspettati, quindi potresti includere anche un controllo per is_admin()
.
Esempio:
if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
// fai qualcosa
}
Ho chiesto un modo più semplice per verificare questo molto tempo fa, e finalmente è stato implementato nella versione 4.7.0.
Quindi per WordPress 4.7 e versioni successive puoi usare:
if ( wp_doing_ajax() )
{
// fai qualcosa
}

if ( defined( 'DOING_AJAX' ) )
è sufficiente da solo. La costante è impostata solo in admin-ajax.php
quindi non è necessario verificare un valore.

@JohnReid È una costante globale, chiunque può impostarla su qualsiasi valore, incluso FALSE
.

Ottimo punto. Non c'è nessun punto nel core di WP che imposta questo valore ma suppongo che non significhi che qualche plugin non conforme non possa impostarlo su false
. Un +1 per te, signore!

È il modo del codex, ma in pratica ho visto persone impostare quel flag nel loro tema, quindi questa soluzione è buona se vuoi sapere se dovresti comportarti come se fosse ajax, ma potrebbe non essere la migliore se hai effettivamente bisogno di sapere se si tratta di una richiesta ajax.

Buone notizie, la funzione è ora disponibile.
File: /wp-includes/load.php
1037: /**
1038: * Determina se la richiesta corrente è una richiesta Ajax di WordPress.
1039: *
1040: * @since 4.7.0
1041: *
1042: * @return bool True se è una richiesta Ajax di WordPress, false altrimenti.
1043: */
1044: function wp_doing_ajax() {
1045: /**
1046: * Filtra se la richiesta corrente è una richiesta Ajax di WordPress.
1047: *
1048: * @since 4.7.0
1049: *
1050: * @param bool $wp_doing_ajax Se la richiesta corrente è una richiesta Ajax di WordPress.
1051: */
1052: return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }
Per riassumere, il file admin-ajax.php
definisce qualcosa di simile a questo.
File: /wp-admin/admin-ajax.php
11: /**
12: * Esecuzione del processo Ajax.
13: *
14: * @since 2.1.0
15: */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18: define( 'WP_ADMIN', true );
19: }

La soluzione Fuxias restituisce false
anche per le richieste ajax effettuate dal pannello di amministrazione. Tuttavia, queste richieste dovrebbero restituire true
, poiché i dati richiesti sono destinati a una vista di amministrazione. Per risolvere questo problema, puoi utilizzare la seguente funzione:
function saveIsAdmin() {
//Le richieste Ajax vengono sempre identificate come pagine dell'interfaccia di amministrazione
//quindi verifichiamo se stiamo richiedendo i dati per il frontend o il backend
if (wp_doing_ajax()) {
$adminUrl = get_admin_url();
//Se il referer è un URL di amministrazione, stiamo richiedendo i dati per il backend
return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
}
//Se non è una richiesta ajax, utilizza semplicemente la funzione normale
return is_admin();
}
