Saya telah melihat beberapa diskusi tentang cara membuat Wordpress untuk membuat kembali sebuah layanan unik untuk permintaan Ajax berikutnya, tetapi untuk kehidupan saya, saya tidak bisa benar-benar membuat Wordpress melakukannya - setiap kali saya meminta apa yang saya pikir harus menjadi yang baru Nonce, saya mendapatkan Nonce yang sama kembali dari Wordpress. Saya mengerti konsep WP's nonce_life dan bahkan mengaturnya untuk sesuatu yang lain, tetapi itu tidak membantu saya.
Saya tidak menghasilkan nonce di objek JS di header melalui lokalisasi - saya melakukannya di halaman tampilan saya. Saya bisa mendapatkan halaman saya untuk memproses permintaan Ajax, tetapi ketika saya meminta nonce baru dari WP di callback, saya mendapatkan nonce yang sama kembali, dan saya tidak tahu apa yang saya lakukan salah ... Pada akhirnya saya ingin memperpanjang ini sehingga mungkin ada beberapa item pada halaman, masing-masing dengan kemampuan untuk menambah / menghapus - jadi saya membutuhkan solusi yang akan memungkinkan beberapa permintaan Ajax berikutnya dari satu halaman.
(Dan saya harus mengatakan saya telah meletakkan semua fungsi ini ke dalam sebuah plugin, jadi "halaman tampilan" front-end sebenarnya adalah fungsi yang disertakan dengan plugin ...)
functions.php: melokalkan, tapi saya tidak membuat nonce di sini
wp_localize_script('myjs', 'ajaxVars', array('ajaxurl' => 'admin-ajax.php')));
Memanggil JS:
$("#myelement").click(function(e) {
e.preventDefault();
post_id = $(this).data("data-post-id");
user_id = $(this).data("data-user-id");
nonce = $(this).data("data-nonce");
$.ajax({
type: "POST",
dataType: "json",
url: ajaxVars.ajaxurl,
data: {
action: "myfaves",
post_id: post_id,
user_id: user_id,
nonce: nonce
},
success: function(response) {
if(response.type == "success") {
nonce = response.newNonce;
... other stuff
}
}
});
});
Menerima PHP:
function myFaves() {
$ajaxNonce = 'myplugin_myaction_nonce_' . $postID;
if (!wp_verify_nonce($_POST['nonce'], $ajaxNonce))
exit('Sorry!');
// Get various POST vars and do some other stuff...
// Prep JSON response & generate new, unique nonce
$newNonce = wp_create_nonce('myplugin_myaction_nonce_' . $postID . '_'
. str_replace('.', '', gettimeofday(true)));
$response['newNonce'] = $newNonce;
// Also let the page process itself if there is no JS/Ajax capability
} else {
header("Location: " . $_SERVER["HTTP_REFERER"];
}
die();
}
Fungsi tampilan PHP frontend, di antaranya adalah:
$nonce = wp_create_nonce('myplugin_myaction_nonce_' . $post->ID);
$link = admin_url('admin-ajax.php?action=myfaves&post_id=' . $post->ID
. '&user_id=' . $user_ID
. '&nonce=' . $nonce);
echo '<a id="myelement" data-post-id="' . $post->ID
. '" data-user-id="' . $user_ID
. '" data-nonce="' . $nonce
. '" href="' . $link . '">My Link</a>';
Pada titik ini saya akan sangat berterima kasih atas setiap petunjuk atau petunjuk dalam mendapatkan WP untuk membuat ulang sebuah layanan unik untuk setiap permintaan Ajax baru ...
UPDATE: Saya telah memecahkan masalah saya. Cuplikan kode di atas valid, namun saya mengubah kreasi $ newNonce di PHP callback untuk menambahkan string mikrodetik untuk memastikan bahwa itu unik pada permintaan Ajax berikutnya.
Jawaban:
Inilah jawaban yang sangat panjang dari pertanyaan saya sendiri yang lebih dari sekedar menjawab pertanyaan tentang menghasilkan nonces unik untuk permintaan Ajax berikutnya. Ini adalah fitur "tambahkan ke favorit" yang dibuat generik untuk keperluan jawaban (fitur saya memungkinkan pengguna menambahkan ID posting lampiran foto ke daftar favorit, tetapi ini dapat berlaku untuk berbagai fitur lain yang bergantung pada Ajax). Saya mengkodekan ini sebagai plugin mandiri, dan ada beberapa item yang hilang - tetapi ini harus cukup detail untuk memberikan intisari jika Anda ingin mereplikasi fitur. Ini akan bekerja pada masing-masing posting / halaman, tetapi juga akan berfungsi dalam daftar posting (misalnya Anda dapat menambah / menghapus item ke inline favorit melalui Ajax dan setiap posting akan memiliki tingkat unik tersendiri untuk setiap permintaan Ajax). Perlu diingat bahwa ada '
scripts.php
Favorites.js (Banyak hal debug yang dapat dihapus)
Fungsi (tampilan ujung depan & aksi Ajax)
Untuk menampilkan tautan Tambah / Hapus Favorit, cukup panggil di halaman / posting Anda melalui:
Fungsi tampilan front-end:
Fungsi aksi Ajax:
sumber
Saya benar-benar harus mempertanyakan alasan di balik mendapatkan nilai baru untuk setiap permintaan ajax. Angka awal akan kedaluwarsa, tetapi dapat digunakan lebih dari satu kali hingga selesai. Memiliki javascript menerimanya melalui ajax mengalahkan tujuan, terutama menyediakannya pada kasus kesalahan. (Tujuan nonces adalah sedikit keamanan untuk mengaitkan tindakan dengan pengguna dalam jangka waktu tertentu.)
Saya tidak seharusnya menyebutkan jawaban lain, tapi saya baru dan tidak bisa berkomentar di atas, jadi sehubungan dengan "solusi" yang diposting, Anda mendapatkan angka baru setiap kali tetapi tidak menggunakannya dalam permintaan. Tentu akan sulit untuk mendapatkan mikrodetik yang sama setiap waktu untuk mencocokkan setiap elemen baru yang dibuat dengan cara itu. Kode PHP memverifikasi terhadap nonce asli, dan javascript memasok nonce asli ... sehingga berfungsi (karena belum kedaluwarsa).
sumber
check_ajax_referer
mengembalikan -1, yang bukan yang kita inginkan!