web-dev-qa-db-fra.com

Comment vérifier si je suis dans admin-ajax.php?

À l’heure actuelle, j’utilise in_admin() pour déterminer si l’utilisateur est dans l’interface du site ou dans la zone admin. Cependant, le problème se produit lorsque les plugins utilisent admin-ajax.php pour traiter les requêtes ajax.

J'ai besoin d'un moyen d'enregistrer les points d'ancrage et les plugins uniquement lors du traitement du fichier admin-ajax.php ou dans l'interface du site. Quelle est la meilleure façon de s'y prendre?

26
Extrakun

Vérifiez la constante DOING_AJAX. Sa définition est le premier code de travail dans wp-admin/admin-ajax.php. Certains plugins très étranges, comme Jetpack, sont définissant cette constante dans des endroits inattendus , vous pouvez donc également inclure une vérification de is_admin().

Exemple:

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

J'ai demandé un moyen plus simple de vérifier cela il y a longtemps, et cela a finalement été mis en œuvre dans la version 4.7.0.

Donc, pour WP 4.7 et versions ultérieures, vous pouvez utiliser:

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

Bonne nouvelle, la fonction est là maintenant.

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

Pour récapituler, le admin-ajax.php définit quelque chose comme ceci.

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

La solution Fuxias renvoie false également pour les demandes ajax effectuées à partir du panneau d'administration. Mais ces demandes doivent renvoyer true, car les données que vous demandez sont fournies pour une vue administrateur. Pour résoudre ce problème, vous pouvez utiliser la fonction suivante:

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