Come verificare se mi trovo in admin-ajax.php?

27 ott 2012, 20:27:15
Visualizzazioni: 28.7K
Voti: 35

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?

0
Tutte le risposte alla domanda 4
4
72

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
}
27 ott 2012 20:36:56
Commenti

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

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

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

fuxia fuxia
26 nov 2014 18:36:50

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!

John Reid John Reid
1 dic 2014 12:32:59

È 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.

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

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: }
15 dic 2016 02:44:26
Commenti

Grazie per l'aggiornamento! Mi era sfuggito nelle note di rilascio della 4.7.

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

Ciao @TomAuger, ottimo. Questa funzione è la Michael Jordan dell'ajax. Grazie 23

prosti prosti
1 feb 2017 16:42:10
0

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();
}
18 nov 2017 23:14:49
0

La costante DOING_AJAX verifica se ti trovi in admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // fai qualcosa
}
28 ago 2019 01:07:21