web-dev-qa-db-fra.com

Déterminer si c'est un AJAX appel de front-end ou de back-end

Je développe un plugin réservé à l'administrateur, qui utilise des appels ajax dans son interface. Le site Web lui-même repose également sur des appels ajax sur son interface frontale.

J'aimerais pouvoir identifier le moment où le WP est chargé en raison d'un "appel simple", d'un "appel AJAX" ou d'un "appel frontal AJAX". Le cas d'utilisation, dans sa forme la plus simple, pourrait être de charger mon plug-in uniquement sur les pages d'administration ou leurs appels ajax. En plus, ça aide de ne pas casser le front-end en développant sur un site live :)

Jusqu'à présent, j'ai trouvé ce qui suit:

  • is_admin() renvoie vrai sur tous les appels AJAX (ce qui est étrange, à mon humble avis)
  • comme tous mes appels AJAX se font via jQuery, je peux déterminer un appel AJAX par la variable HTTP HTTP_X_REQUESTED_WITH (voir ici ).

Mais je n'arrive toujours pas à comprendre comment faire la distinction entre AJAX du côté de l'administrateur et AJAX du côté du serveur. Des idées?

1
Aurimas

Je comprends le problème que vous rencontrez, je pensais à la même chose.

Ce n’est pas vraiment un problème, c’est plutôt une question de bonne conception de la programmation et une bonne séparation du front-end et du back-end.

Maintenant, la façon dont j'ai réussi à résoudre ceci est la suivante:

J'espère que vous appelez votre action AJAX avec wp_localize_script. Nous allons étendre ceci un peu en l'implémentant de cette façon:

wp_localize_script(
    'my-site-script',
    'my_ajax_object',
    array(
        'my_ajax_url' => admin_url( 'admin-ajax.php' ),
        'my_frontend_call' => 'something-here',
        'my_nonce' => wp_create_nonce( 'my_nonce' )
);

Ceci est UNIQUEMENT ajouté dans la page d'accueil, je suis sûr que vous savez comment cela fonctionne. Maintenant, comme vous le savez, cela va ajouter un petit morceau de javascript. Notez ici la variable my_frontend_call, c’est l’important que nous allons utiliser.

Plus d'instructions sur la façon de mettre en place un bon appel ajax ici: link

Maintenant nous avons tout configuré, maintenant nous pouvons facilement implémenter la logique dans le backend comme ceci:

<?php
// Here we check that we are facing the backend.
// This will also be true if we are facing the 
// frontend but making an AJAX call. 
// As you say bad, also IMO
if( is_admin() )
{
        //Now here we are going to put the magic
        if(isset($_POST['my_frontend_call'])){
            // Now these actions are loaded only when `my_frontend_call` is set
            // You can add everything here that only get's loaded on a call where
            // `my_frontend_call` is set
            add_action('wp_ajax_handle_frontend_ajax', 'handle_frontend_ajax_callback');
            add_action('wp_ajax_admin_only_ajax', 'admin_only_ajax_callback');
        }
}

Maintenant, vous pouvez mélanger un peu cela avec différentes variables de différents endroits.

Je ne sais pas pourquoi ce n'est pas une recommandation connue. À mon avis, c'est moche quand des trucs sont chargés quand on n'en a même pas besoin.

NOTE WordPress étant encore nouveau pour moi, ce n'est peut-être pas une bonne méthode. J'espère que certains des professionnels présents pourront commenter.

1
Saif Bechan

is_admin() renvoie vrai sur tous les appels AJAX (ce qui est étrange, à mon humble avis)

Ce n’est pas étrange, car les appels Ajax suivent beaucoup plus de logique de chargement d’administrateur que de front-end. Ajax load est essentiellement une version spécialisée de admin load.

Le cas d'utilisation, dans sa forme la plus simple, pourrait être de charger mon plug-in uniquement sur les pages d'administration ou leurs appels ajax.

Je ne suis pas sûr de te comprendre. La mise en file d'attente des scripts ne dépend pas d'Ajax. Si vous ne voulez pas de script au début, ne le chargez pas là.

WordPress moderne ne s'appuie pas sur les référents et, par exemple, sur la détection de l'origine des appels, mais des nonces doivent être utilisées pour la vérification de la source et de l'intention.

Comme il s’agit de votre propre code, le moyen le plus simple de distinguer une requête est d’avoir un argument explicite avec une information, que ce soit de l’avant ou de l’arrière.

1
Rarst
is_admin() returns always true whether it is from back or front ajax request.

Mon idée est très simple. 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