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

27

En ce moment pour mon plugin, j'utilise in_admin()pour déterminer si l'utilisateur est dans le frontend du site ou dans la zone d'administration. Cependant, le problème se produit lorsque les plugins utilisent admin-ajax.phppour traiter les demandes ajax.

J'ai besoin d'un moyen d'enregistrer les hooks et les plugins uniquement lors du traitement du admin-ajax.phpfichier ou dans le frontend du site. Quelle est la meilleure façon de procéder?

Extrakun
la source

Réponses:

61

Vérifiez la constante DOING_AJAX. Sa définition est le premier code de travail en wp-admin/admin-ajax.php. Certains plugins très étranges, comme Jetpack, définissent cette constante dans des endroits inattendus , vous pouvez donc également inclure une vérification 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é implémenté dans 4.7.0.

Ainsi, pour WP 4.7 et supérieur, vous pouvez utiliser:

if ( wp_doing_ajax() )
{
    // do something
}
fuxia
la source
4
if ( defined( 'DOING_AJAX' ) )est suffisant en soi. La constante n'est définie que admin-ajax.phppour que vous n'ayez pas besoin de vérifier une valeur.
John Reid
5
@JohnReid C'est une constante globale, n'importe qui peut la définir sur n'importe quelle valeur, y compris FALSE.
fuxia
Bon point. Il n'y a nulle part dans le noyau WP qui définit cette valeur, mais je suppose que cela ne signifie pas que certains plugins malveillants pourraient ne pas la définir à la falseplace. Un +1 pour vous, monsieur!
John Reid
1
C'est la voie du codex, mais dans la pratique, j'ai vu des gens mettre ce drapeau dans leur thème, donc cette solution est bonne si vous voulez savoir si vous devez vous comporter comme si elle était ajax, mais peut-être pas mieux si vous avez réellement besoin de savoir si c'est une demande ajax.
Mark Kaplun
5

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

Juste pour récapituler, le admin-ajax.phpdéfinit quelque chose comme ça.

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: }
prosti
la source
Merci pour la mise à jour! J'ai manqué celui-là dans les notes de version 4.7.
Tom Auger
Salut @ TomAuger, cool. Cette fonction est un Michael Jordan d'ajax. Merci 23
prosti
1

La solution Fuxias revient falseégalement pour la demande ajax effectuée à partir du panneau d'administration. Mais ces demandes devraient revenir true, car les données que vous demandez sont fournies pour une vue d'administration. 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();
}
GM_Alex
la source
0

DOING_AJAX vérifications constantes si vous êtes admin-ajax.php

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