J'ai besoin d'un conditionnel qui existe si le contexte n'est pas une vue frontale y compris AJAX demandes. J'ai ceci en ce moment:
if (is_admin() && !DOING_AJAX)
return;
Le bit DOING_AJAX
est requis car is_admin()
renvoie true
pour les demandes ajax. Cependant, je crois que DOING_AJAX
sera true
pour TOUTES les demandes ajax, y compris celles sur le backend. Ainsi, cela n’ajoute pas vraiment quelque chose ici.
Comment puis-je fourcher les deux conditions? Les demandes ajax front-end/back-end peuvent-elles être distinguées?
merci!
Merci pour les informations, mais pour clarifier, dans ce cas, le crochet lui-même n'est pas une action ajax. C'est un crochet de filtrage dans get_the_terms
qui doit fonctionner sur toute requête frontale , y compris tout thème arbitraire ou code ajax de plugin. Il doit également ignorer le traitement pour le back-end, d'où la nécessité de la condition de forking. Le problème est que les demandes ajax retournent toujours true pour is_admin()
Au cas où vous seriez curieux, c’est un plugin qui cache les balises "secrètes" ou "cachées" sur le front-end, tout en permettant à leurs pages de taxonomie d’exister. La "dissimulation" doit être ignorée sur le serveur pour des raisons évidentes.
Merci pour l'aide. Désolé pour la confusion initiale!
DOING_AJAX
et WP_ADMIN
(cette constante est cochée dans is_admin()
) sont définis dans admin-ajax.php et définissent tro true. Les deux ne sont pas très utiles dans cette situation.
Ajoutez un paramètre à votre requête ajax si celle-ci provient du serveur:
<?php
function my_action_javascript() {
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {
var data = {
action: 'my_action',
frontend_request: true,
whatever: 1234
};
// since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
$.post(ajaxurl, data, function(response) {
alert('Got this from the server: ' + response);
});
});
</script>
<?php
}
Dans votre rappel ajax, vous pouvez maintenant vérifier si le paramètre est présent et mettre à true:
$from_frontend = isset( $_REQUEST['frontend_request'] ) && ( TRUE === (bool) $_REQUEST['frontend_request'] );
$doing_ajax = defined( 'DOING_AJAX' ) && TRUE === DOING_AJAX;
$is_frontend_request = $frontend && $doing_ajax;
if( TRUE === $is_frontend_request ){
// yes, this request came from the front-end
echo 'On frontend';
} else {
// no, we are somewhere else
echo 'Somewhere else';
}
Utilisez simplement des actions séparées pour les requêtes ajax front-end et admin.
Que la demande provienne de l'interface utilisateur ou de l'administrateur:
wp_ajax_{action}
est déclenché lorsque l'utilisateur est connecté wp_ajax_nopriv_{action}
est déclenché lorsque l'utilisateur ne l'est pas.Donc, si vous voulez savoir si la demande provient du serveur frontal ou de l’administrateur, je vous recommande d’utiliser différentes actions . Ceci est similaire à l'approche @ Ralf912 - à la différence qu'au lieu d'envoyer une variable distincte, des actions différentes sont appliquées aux requêtes front-end et admin.
Vous pouvez également vous protéger des "dupés" en utilisant des nonces (mais si la sécurité est un problème - vous ne devriez utiliser wp_ajax_{action}
que lorsque la demande provient d'un écran d'administration).
Vous utilisez probablement AJAX hook
add_action('wp_ajax_{your_hook}', 'your_function');
dans votre_fonction, vous pouvez ajouter:
function your_function() {
define('FRONT_AJAX',true);
}
Donc, vous pouvez ajouter votre chèque nécessaire comme ceci:
if (is_admin() && defined('FRONT_AJAX'))
return;
Vous êtes très proches les gars! Mais wp_ajax _ ** crochets déclenchent plus tard que nous avons généralement besoin de cette constante FRONT_AJAX. Ainsi, ma solution fonctionne mieux selon mes besoins.
dans functions.php:
add_action( 'init', 'ib_define_front_ajax', 1 );
function ib_define_front_ajax(){
if (isset($_REQUEST['FRONT_AJAX']) && $_REQUEST['FRONT_AJAX']=='true')
define('FRONT_AJAX',true);
}
Ensuite, lorsque vous devez exclure:
if ( !is_admin() || defined('FRONT_AJAX'))
Ou simplement vérifier (selon la réponse de gagn):
if (is_admin() && defined('FRONT_AJAX'))
return;
L'idée partagée par Stephen Harris, c'est Nice, mais mon idée est très simple.
is_admin() returns always true whether it is from back or front ajax request.
Il suffit de définir deux noms différents pour le champ nonce. (Ainsi, mis à part le développeur, personne ne saura quel nom et dans quel but.) Exemple:
add_action('wp_ajax_{my_ajax_hook}', 'my_ajax_function');
function my_ajax_function() {
if( isset($_REQUEST['f_nonce']) ){
$fromFront = true;
$nonceField = 'f_nonce';
}else{
//by default from backend or you can alter;
$fromFront = false;
$nonceField = 'b_nonce';
}
if ( ! wp_verify_nonce( $_REQUEST[$nonceField], 'my-nonce-pass' ) ) {
die( 'Security check' );
} else {
// Do stuff here according to the value of $fromFront;
}
exit();
}
* Les données nonce doivent figurer avec chaque appel ajax pour sécuriser votre script conformément à http://codex.wordpress.org/AJAX_in_Plugins .