Mengapa menggunakan admin-ajax.php dan bagaimana cara kerjanya?

9

Panggilan ajax saya untuk data json berfungsi dengan baik seperti ini 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.

Saya punya 2 pertanyaan.

1) Mengapa menggunakan admin-ajax.php alih-alih menyandikan json Anda dalam file terpisah seperti themes/example/json.phpdan menyandikan data Anda di sana?

2) Bagaimana cara kerja admin-ajax.php? Saya tidak mengerti banyak dari file itu. Apakah ini memuat semua fungsi sehingga Anda siap untuk menggunakannya?

Terima kasih!

Claudiu Creanga
sumber
2
Sebagai catatan, setiap jawaban akan berbicara tentang mengapa themes/example/json.phpharus dianggap sebagai kerentanan keamanan utama
Tom J Nowell

Jawaban:

14

1) Mengapa menggunakan admin-ajax.phpalih-alih menyandikan json Anda di file terpisah seperti themes/example/json.phpdan menyandikan data Anda di sana?

Menggunakan admin-ajax.phpberarti bahwa Core WordPress dimuat dan tersedia. Tanpa itu, Anda perlu memuat file-file yang Anda butuhkan, yang merupakan proses yang rumit dan cenderung gagal jika Anda tidak mengetahui Core dengan sangat baik. Dan, seberapa baguskah Anda dengan keamanan Javascript?

2) Bagaimana cara admin-ajax.phpkerjanya? Saya tidak mengerti banyak dari file itu. Apakah ini memuat semua fungsi sehingga Anda siap untuk menggunakannya?

  1. Ini memuat WordPress Core, artinya Anda dapat menggunakan hal-hal seperti $wpdb dan $WP_Query. Yaitu melalui sekitar baris 25.
  2. Ia mengirimkan beberapa header - baris 37 - 41.
    1. Header jenis konten
    2. Header untuk memberi tahu browser agar tidak men-cache hasil
    3. Header yang menarik adalah yang dikirim oleh send_nosniff_headers()
    4. dan nocache_headers().
  3. The admin_initkait kebakaran.
  4. Tindakan inti didefinisikan dan didaftarkan secara dinamis - baris 46 - 73. Ini tidak akan didaftarkan kecuali diperlukan - yaitu, kecuali jika diminta melalui $_GETatau $_POST.
  5. API "detak jantung" fires-- line 75
  6. Status "login" dari pengguna yang meminta diperiksa dan kait administratif yang sesuai atau "tanpa hak istimewa" dipecat.

Item # 1 dan # 6 adalah alasan utama untuk menggunakan API AJAX, menurut saya. Anda memiliki WordPress Core, yang hampir pasti Anda butuhkan, dan Anda memiliki sistem keamanan login yang sama dengan WordPress lainnya.

s_ha_dum
sumber
6

admin-ajax.phpadalah bagian dari WordPress AJAX API , dan ya, ia menangani permintaan dari backend dan front. di sini apa yang saya temukan untuk pertanyaan Anda yaitu:

2) Bagaimana cara kerja admin-ajax.php?

untuk logikanya Anda bisa berkunjung ke sini.

Ini mengasumsikan Anda sudah tahu bagaimana cara membuat JavaScript, dll.

Bagian 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);
        }
    });   

});

Sepotong 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) Mengapa menggunakan admin-ajax.php alih-alih menyandikan json Anda dalam file terpisah seperti tema / contoh / json.php dan menyandikan data Anda di sana?

semoga ini membantu. admin-ajax.php vs Template Halaman Kustom untuk Permintaan Ajax

sohan
sumber
Hai, dapatkah Anda menjelaskan kait tindakan ini 'wp_ajax_example_ajax_request' dan 'wp_ajax_nopriv_example_ajax_request' Saya tidak menemukan penjelasan di mana pun. Juga apa yang diselesaikan oleh ajaxurl? Terima kasih
David Okwii