Come verificare se sono in admin-ajax.php?


27

In questo momento per il mio plugin, sto usando in_admin()per determinare se l'utente si trova nel frontend del sito o nell'area di amministrazione. Tuttavia, il problema si verifica quando i plugin utilizzano admin-ajax.phpper elaborare le richieste Ajax.

Ho bisogno di un modo per registrare hook e plugin solo quando elaboro admin-ajax.phpfile o nel frontend del sito. Qual è il modo migliore per farlo?

Risposte:


61

Controllare la costante DOING_AJAX. La sua definizione è il primo codice funzionante in wp-admin/admin-ajax.php. Alcuni plugin molto strani, come Jetpack, stanno definendo quella costante in luoghi inaspettati , quindi potresti includere anche un controllo is_admin().

Esempio:

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

Ho chiesto un modo più semplice per verificarlo molto tempo fa, e questo è stato finalmente implementato in 4.7.0.

Quindi per WP 4.7 e versioni successive puoi usare:

if ( wp_doing_ajax() )
{
    // do something
}

4
if ( defined( 'DOING_AJAX' ) )è abbastanza da solo. La costante è impostata solo admin-ajax.phpper cui non è necessario verificare un valore.
John Reid,

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

Buon punto. Non c'è nessun posto nel core WP che imposta questo valore, ma suppongo che ciò non significhi che alcuni plugin non autorizzati potrebbero non impostarlo su falseinvece. Un +1 per te, signore!
John Reid,

1
È il modo del codice, ma in pratica ho visto le persone impostare quella bandiera nel loro tema, quindi questa soluzione è buona se vuoi sapere se dovresti comportarti come se fosse un ajax, ma potrebbe non essere la cosa migliore se davvero dovessi sapere se è una richiesta Ajax.
Mark Kaplun l'

5

Buone notizie, la funzione è lì adesso.

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

Giusto per ricapitolare, admin-ajax.phpdefinisce qualcosa del genere.

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

Grazie per l'aggiornamento! Mi mancava quello nelle note di rilascio 4.7.
Tom Auger,

Ehi @ TomAuger, bello. Questa funzione è un Michael Jordan di Ajax. Grazie 23
prosti

1

La soluzione Fuxias ritorna falseanche per una richiesta Ajax effettuata dal pannello di amministrazione. Ma queste richieste dovrebbero tornare true, perché i dati che stai richiedendo sono forniti per una vista di amministrazione. Per risolvere questo problema è possibile utilizzare la seguente funzione:

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

0

DOING_AJAX controlli costanti se ci sei dentro admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.