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