web-dev-qa-db-fra.com

Vérification conditionnelle avant l'interface qui inclut ajax

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!

Clarification

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!

3
Hari Karam Singh

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';
}
1
Ralf912

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).

1
Stephen Harris

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;
1
gagn

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;
0
DocSS

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 .

0
Reza Mamun