web-dev-qa-db-fra.com

is_admin () renvoie true quand vous utilisez admin-ajax.php à partir d'un script frontal

Je me suis retrouvé aujourd'hui dans une situation où j'utilisais admin-ajax.php à partir d'un script frontal. Si je comprends bien, c’est la manière wp de faire des appels ajax (enregistrement de ma fonction avec le hook wp_ajax_nopriv_myfunction)

Il me semble que puisque admin-ajax.php est du côté de l'administrateur, is_admin () renvoie true, alors que mon script l'appelle du côté frontal.

Cela cause un problème avec un plugin que j'utilise qui fait les choses différemment du côté avant et du côté administrateur.

Alors je me demandais si je faisais quelque chose de mal

y a-t-il un moyen d'utiliser ajax devant wp et d'avoir is_admin () pour retourner false?

j'espère pouvoir me faire comprendre

7
Thomas

WordPress définit is_admin() sur true pour toutes les demandes ajax (frontal ou côté administrateur). (Voir codex ).

Il n’est pas inutile de passer outre à cette situation (et vous ne devriez pas le faire de toute façon). Si votre demande ajax peut être lancée à la fois du côté serveur et du côté administrateur, vous pouvez indiquer si elle est 'admin' ou non lorsque vous publiez les données. Mais sans aucun détail sur les "problèmes" qu’il pose avec votre plug-in, il est difficile d’offrir une solution de travail.

5
Stephen Harris

Je voulais activer/désactiver la journalisation sur les serveurs frontaux et administratifs à l'aide d'un bouton de menu du tableau de bord. J'ai simplement ajouté une classe à mon bouton de menu, puis j'ai interrogé le statut de la page d'administration avec jQuery.

https://codex.wordpress.org/Class_Reference/WP_Admin_Bar/add_menu

Ajouter un élément de menu avec le statut d'administrateur en tant que classe

$wp_admin_bar -> add_menu(
  array(
        'title'     => '<span class="ab-icon"></span><span class="ab-label">' . __( 'Console Logging' , 'console-logging' ) . '</span>',
        'id'        => 'your-custom-id',
        'parent'    => false,
        'href'      => '',
        'meta'      => array('class' => 'is-admin-'.is_admin())//GET ACTUAL ADMIN OR NOT in php before page load
));

Récupérez l'élément de menu en utilisant jQuery en javascript et utilisez-le:

 //'is-admin-1' when is_admin() is true
 //'is-admin-0' when is_admin() is false

var is_admin = $('#wp-admin-bar-your-custom-id').hasClass('is-admin-1');

if(is_admin){
    //You are actually on an admin page
}else{
    //You are on a front end page
}
0
Chris Sprague

Je sais que c'est vieux, mais au cas où cela aiderait quelqu'un d'autre qui tombe par hasard sur ça ...

ce que je fais habituellement est de définir une sorte d'indicateur dans mes formulaires frontaux pour indiquer que la demande entrante est ajax.

<input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" />

Initialement, il est défini sur "false", que je bascule ensuite sur "true" tout en commençant à traiter le fichier ajax.

$('#my_ajax_flag').val('true'); // example using jQuery

ensuite, dans la partie admin de mon code, je vérifie la présence de ce paramètre, puis j'inclus mes hooks ajax ou j'effectue mes tâches d'administration non ajax habituelles. Donc par exemple:

if ( isset( $_REQUEST['my_ajax_flag'] ) && $_REQUEST['my_ajax_flag'] == 'true' ) {
    add_action('wp_ajax_my_ajax_function', 'my_ajax_function');     
    add_action('wp_ajax_no_priv_my_ajax_function', 'my_ajax_function');
} else {
    // regular non-ajax stuff
}

en fonction de ce que vous devez faire, il existe de nombreuses variantes de cette idée, mais elle vous permet d'empêcher votre code administrateur habituel d'interférer ou de se déclencher lors de l'exécution de requêtes ajax.

une autre recommandation qui peut être utile consiste à définir l'attribut "noheader" de WordPress dans vos formulaires.

<input type="hidden" name="noheader" value="true" />

lors du traitement de l’arrière-plan qui aboutit finalement à une redirection (recommandé pour éviter la soumission redoutée sous double forme), dans de rares cas marginaux où vous devez accéder à des points d'ancrage wp qui se produiraient normalement après "en-têtes déjà envoyés".

0
br3nt