Pourquoi utiliser admin-ajax.php et comment ça marche?

9

Mon appel ajax pour les données json fonctionne bien comme ceci functions.php:

add_action( 'wp_ajax_nopriv_load-filter', 'prefix_load_cat_posts' );
add_action( 'wp_ajax_load-filter', 'prefix_load_cat_posts' );
function prefix_load_cat_posts () {
  //get data here
}

javascript:

var ajaxurl = 'http://'+window.location.host+'/wp-admin/admin-ajax.php';
jQuery.ajax({
    type: 'POST',
    url: ajaxurl,
    etc.

J'ai 2 questions.

1) Pourquoi utiliser admin-ajax.php au lieu d'encoder votre json dans un fichier séparé comme themes/example/json.phpet d'y encoder vos données?

2) Comment fonctionne admin-ajax.php? Je ne comprends pas grand-chose de ce dossier. Charge-t-il toutes les fonctions pour que vous soyez prêt à les utiliser?

Merci!

Claudiu Creanga
la source
2
Il convient de noter que toute réponse indiquerait pourquoi themes/example/json.phpdevrait être considérée comme une vulnérabilité de sécurité majeure
Tom J Nowell

Réponses:

14

1) Pourquoi utiliser admin-ajax.phpau lieu d'encoder votre json dans un fichier séparé comme themes/example/json.phpet y encoder vos données?

L'utilisation admin-ajax.phpsignifie que WordPress Core est chargé et disponible. Sans cela, vous devrez charger manuellement les fichiers dont vous avez besoin, ce qui est un processus compliqué et susceptible d'échouer si vous ne connaissez pas très bien le Core. Et, comment êtes-vous bon avec la sécurité Javascript?

2) Comment ça admin-ajax.phpmarche? Je ne comprends pas grand-chose de ce dossier. Charge-t-il toutes les fonctions pour que vous soyez prêt à les utiliser?

  1. Il charge WordPress Core, ce qui signifie que vous pouvez utiliser des choses comme $wpdb et $WP_Query. C'est à peu près à la ligne 25.
  2. Il envoie quelques en-têtes - lignes 37 à 41.
    1. Un en-tête de type de contenu
    2. Un en-tête pour dire aux navigateurs de ne pas mettre en cache les résultats
    3. Les en-têtes intéressants sont ceux envoyés par send_nosniff_headers()
    4. et nocache_headers().
  3. Le admin_initcrochet se déclenche.
  4. Les actions principales sont définies et enregistrées dynamiquement - lignes 46 à 73. Elles ne seront enregistrées que si elles sont nécessaires - c'est-à-dire, à moins qu'elles ne soient demandées via $_GETou $_POST.
  5. Le crochet API "Heartbeat" se déclenche - ligne 75
  6. Le statut "connecté" de l'utilisateur demandeur est vérifié et le hook administratif ou "sans privilège" approprié est déclenché.

Les éléments # 1 et # 6 sont les principales raisons d'utiliser l'API AJAX, à mon avis. Vous avez le WordPress Core, dont vous avez presque certainement besoin, et vous avez le même système de sécurité de connexion qu'avec le reste de WordPress.

s_ha_dum
la source
6

admin-ajax.phpfait partie de l' API WordPress AJAX , et oui, il gère les demandes du backend et du front. voici ce que je trouve pour votre question:

2) Comment fonctionne admin-ajax.php?

pour la logique que vous pouvez visiter ici.

Cela suppose que vous savez déjà comment mettre en file d'attente JavaScript, etc.

Pièce JavaScript:

jQuery(document).ready(function($) {

    // We'll pass this variable to the PHP function example_ajax_request
    var fruit = 'Banana';

    // This does the ajax request
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // This outputs the result of the ajax request
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

Pièce PHP:

function example_ajax_request() {

    // The $_REQUEST contains all the data sent via ajax 
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Let's take the data that was sent and do something with it
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Now we'll return it to the javascript function
        // Anything outputted will be returned in the response
        echo $fruit;

        // If you're debugging, it might be useful to see what was sent in the $_REQUEST
        // print_r($_REQUEST);

    }

    // Always die in functions echoing ajax content
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// If you wanted to also use the function for non-logged in users (in a theme for example)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1) Pourquoi utiliser admin-ajax.php au lieu d'encoder votre json dans un fichier séparé comme themes / example / json.php et y encoder vos données?

peut être utile. admin-ajax.php vs Modèle de page personnalisé pour les demandes Ajax

sohan
la source
Hé, pouvez-vous expliquer ces crochets d'action 'wp_ajax_example_ajax_request' et 'wp_ajax_nopriv_example_ajax_request' Je ne trouve aucune explication nulle part. Aussi, qu'est-ce que ajaxurl résout? Merci
David Okwii