Bagaimana mengatur panggilan ajax dan JSON di wordpress

13

Saya memiliki jenis posting khusus yang ingin saya akses melalui jQuery - lebih disukai menggunakan JSON.

Jadi hal pertama yang pertama. membuat fungsi yang mengembalikan / gema json cukup mudah, tetapi bagaimana saya mengaksesnya melalui jquery.

seperti yang ditulis Mike dalam pertanyaan ini , dia - sejauh yang saya mengerti - menempatkannya di root wordpress. yang membuatnya dapat diakses menggunakan nama file php - tetapi Apakah ini direkomendasikan? Saya lebih suka memasukkannya ke dalam folder plugin.

Saya sudah mencoba membaca codex wordpress, tetapi cara panggilan ajax ditangani hanya membingungkan saya, karena Anda memposting setiap panggilan ajax ke admin-ajax.php, meskipun itu bukan halaman admin?

Bisakah seseorang meluruskan masalah yang saya alami?

/Badai

sunting

Masalah yang saya miliki adalah memahami bagaimana panggilan ajax harus dilakukan di wordpress, serta di mana menempatkan kode php dan js Anda untuk melakukan / menangani panggilan.

Di pertanyaan lain yang saya tautkan, Anda membuat fungsi menempatkan file di root wp - Saya tidak ingin melakukan itu. Tapi sekarang saya telah belajar cara menggunakan wp_ajax_ (nopriv _) [action] dan secara efektif dapat mengakses json yang saya buat. Masalah yang tersisa adalah Di mana saya harus menempatkan JS untuk melakukan panggilan. Saya ingin meletakkannya di file plugs js, tetapi karena ini akan disajikan di halaman, bukan di situs admin, ajaxurl tidak didefinisikan, jadi saya harus mengulang menggunakan php.

echo admin_url('admin-ajax.php');

Jadi pertanyaannya adalah bagaimana saya harus menggabungkan php ini dengan javascript, dan bagaimana seharusnya saya kemudian membuatnya, mengingat itu bukan file atau skrip.

Badai
sumber
Saya ingin mengedit judul pertanyaan Anda untuk memberikan judul yang lebih deskriptif tetapi setelah membaca saya masih belum 100% yakin apa pertanyaan Anda. Apakah Anda hanya bertanya bagaimana mengakses umpan JSON, tidak terkait dengan jenis posting khusus (bukankah CPT tidak benar-benar diimpor ke pertanyaan Anda?) Dan apakah penting bahwa itu tidak ada di root? Apakah ini untuk fungsionalitas admin? Mungkin akan membantu jika Anda menjelaskan apa yang sebenarnya ingin Anda capai dari perspektif pengguna akhir selain pendekatan teknis yang Anda perjuangkan?
MikeSchinkel
Ya, saya bisa setuju bahwa judul itu bukan yang paling deskriptif. Saya hanya agak menaruh sesuatu di sana karena saya diposting dengan yang lebih buruk pada awalnya. Posting yang diedit dengan Info lebih lanjut.
Badai
Tipe posting kustom yang baru saja saya masukkan, karena plugin json-api yang tampaknya populer sebenarnya tidak mencakup tipe posting kustom.
Storm

Jawaban:

17

Ajax Handler

Memang agak membingungkan bahwa handler Ajax ada di wp-admin/direktori, tapi ya, Anda bisa dan harus menggunakannya untuk permintaan non-admin juga. Anda kemudian mendaftarkan pawang untuk wp_ajax_nopriv_[action]kait, bukan yang normal wp_ajax_[action]. Dalam hal ini Anda hanya perlu mengikuti baris pertamaadmin-ajax.php , karena permintaan yang dilakukan oleh pengguna yang tidak masuk akan meninggalkan halaman sekitar baris 50.

Jadi daftarkan fungsi untuk hook wp_ajax_nopriv_get_custom_post_data, dan itu akan dipanggil jika Anda meminta admin-ajax.phpdengan actionparameter yang diatur ke get_custom_post_data. Pastikan untuk menelepon sendiri die()di akhir handler Anda, jika tidak maka default die(-1)akan dikembalikan. Dan juga daftarkan versi login-nya, wp_ajax_get_custom_post_data(ke fungsi handler yang sama, tidak ada masalah), karena jika Anda masuk ke situs Anda, Anda tidak akan menemui noprivkesulitan.

Konfigurasi sisi server ke Javascript

Trik untuk mengirim data konfigurasi sisi server (seperti admin-ajax.phpurl), adalah wp_localize_script(). Anda memberikannya array kunci dan nilai yang akan dimasukkan di bagian atas halaman. Ini mungkin awalnya dibuat hanya untuk string yang dapat dilokalisasi, tetapi Anda dapat menggunakannya untuk melewatkan data konfigurasi juga.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configadalah nama pegangan (jika Anda ingin membagikannya nanti), storm_configadalah nama objek Javascript yang akan berisi data Anda. Jadi file Javascript statis Anda dapat berisi baris seperti jQuery.post(storm_config.ajaxurl, ...).

Lihat juga jawaban bueltge untuk pertanyaan serupa .

Javascript statis dari dir plugin

Untuk memuat file Javascript statis dari dir plugin Anda sendiri, Anda gunakan wp_enqueue_script(). Itu akan terlihat seperti ini:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Di mana storm_jsonlagi nama pegangan, maka Anda memberikan tautan ke file, lalu dependensi (bisa null), dan kemudian nomor versi yang akan ditambahkan setelah permintaan untuk mengalahkan cache browser pada pembaruan.

Jan Fabry
sumber
jawaban yang bagus Ini adalah apa yang saya ingin tahu, dan saya tampaknya berhasil. Sekarang saya dapat mengakses /wp-admin/admin-ajax.php?action=[action] dan mendapatkan hasil json. Masalah saya sekarang adalah di mana harus meletakkan js untuk melakukan panggilan ajax. Karena saya harus meletakkan echo admin_url ('admin-ajax.php'); sebagai url, saya tidak bisa memasukkannya ke file plugs js saya. Jadi bagaimana saya akan melakukannya? Saya tidak hanya ingin mencetak skrip di tengah halaman.
Badai
@ Storm: Saya memperluas jawaban saya wp_localize_script(), yang dapat Anda gunakan untuk mengirim data konfigurasi dari sisi server ke browser. (Kiat kecil: Jika Anda menambahkan @nama pengguna, orang itu akan mendapat pemberitahuan tentang balasan Anda. Jadi, @Mike: I updated the titlepastikan dia melihat komentar Anda)
Jan Fabry
Terima kasih banyak Jan. Sekarang saya pikir saya mengerti seluruh paket. Saya harus sedikit bermain-main dengan itu semua untuk memahaminya sepenuhnya tetapi Anda telah sangat membantu! Jawaban diterima =) btw terima kasih atas @ note. Tetapi saat saya mengomentari jawaban Anda sekarang, Anda masih akan mendapatkan peringatan, bukan?
Badai
@Storm: Ya, lansiran masuk ke penulis pertanyaan atau jawaban yang Anda komentari, dan juga bisa masuk ke peserta lain yang Anda sebutkan di @ -mengomentari. Jadi saya mendapat notifikasi "gratis", tetapi Anda tidak akan mendapatkannya untuk pesan ini jika saya tidak menyertakan Anda. Ada penjelasan lengkap tentang situs meta umum dari jaringan Stack Exchange.
Jan Fabry