วิธีจัดการ ajax call และ JSON ใน wordpress


13

ฉันมีประเภทโพสต์ที่กำหนดเองที่ฉันต้องการเข้าถึงผ่าน jQuery - ควรใช้ JSON

ดังนั้นสิ่งแรกก่อน การสร้างฟังก์ชั่นที่คืนค่า / echos json นั้นง่ายพอ แต่ฉันจะเข้าถึงมันผ่าน jquery ได้อย่างไร

อย่างที่ไมค์เขียนในคำถามนี้เขา - เท่าที่ฉันเข้าใจ - วางไว้ในรูท WordPress ซึ่งจะทำให้สามารถเข้าถึงได้โดยใช้ชื่อไฟล์ php - แต่นี่คือการแนะนำหรือไม่ ฉันอยากจะวางไว้ในโฟลเดอร์ปลั๊กอิน

ฉันได้ลองอ่าน wordpress codex แต่วิธีการจัดการการโทร ajax ทำให้ฉันสับสนเพราะคุณโพสต์ทุกการโทร ajax ไปที่ admin-ajax.php แม้ว่ามันจะไม่ใช่หน้าผู้ดูแลระบบก็ตาม

ใครช่วยกรุณาแก้ไขปัญหาที่ฉันมีให้ตรง

/พายุ

แก้ไข

ปัญหาที่ฉันได้รับคือการเข้าใจวิธีการโทร ajax ใน wordpress รวมถึงสถานที่ที่จะวางโค้ด php และ js ของคุณเพื่อทำ / จัดการการโทร

ในคำถามอื่น ๆ ที่ฉันเชื่อมโยงคุณสร้างฟังก์ชั่นการวางไฟล์ใน wp root - ฉันไม่ต้องการทำเช่นนั้น แต่ตอนนี้ฉันได้เรียนรู้วิธีใช้ wp_ajax_ (nopriv _) [action] และสามารถเข้าถึง json i ที่สร้างได้อย่างมีประสิทธิภาพ ปัญหาที่เหลือคือที่ที่ฉันควรวาง JS เพื่อโทร ฉันต้องการที่จะวางไว้ในไฟล์ปลั๊กอิน js แต่เป็นสิ่งที่จะนำเสนอในหน้าไม่ได้อยู่ในเว็บไซต์ของผู้ดูแลระบบ ajaxurl ไม่ได้กำหนดไว้ดังนั้นฉันต้องสะท้อนการใช้ php

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

ดังนั้นคำถามจะกลายเป็นวิธีที่ฉันควรรวม php นี้กับ javascript และฉันควร enqueue มันอย่างไรเพราะมันไม่ใช่ไฟล์หรือสคริปต์


ฉันต้องการแก้ไขชื่อคำถามของคุณเพื่อให้ชื่อที่มีความหมายมากกว่า แต่หลังจากอ่านแล้วฉันยังไม่แน่ใจ 100% ว่าคำถามของคุณคืออะไร คุณเพียงแค่ถามวิธีเข้าถึงฟีด JSON ซึ่งไม่เกี่ยวข้องกับประเภทโพสต์ที่กำหนดเอง (CPT ไม่ได้นำเข้ากับคำถามของคุณจริง ๆ หรือไม่) และมันสำคัญไหมที่จะไม่อยู่ในรูท มันมีไว้สำหรับฟังก์ชั่นการดูแลระบบหรือไม่? อาจจะช่วยได้ถ้าคุณอธิบายว่าคุณพยายามทำอะไรจากมุมมองของผู้ใช้จริงนอกเหนือไปจากวิธีการทางเทคนิคที่คุณกำลังดิ้นรน?
MikeSchinkel

ใช่ฉันสามารถทำให้หงุดหงิดที่ชื่อไม่ได้อธิบายมากที่สุด ฉันแค่วางบางสิ่งบางอย่างเพราะฉันโพสต์ด้วยยิ่งแย่ลงในตอนแรก โพสต์ที่แก้ไขแล้วพร้อมข้อมูลเพิ่มเติม
พายุ

ประเภทโพสต์ที่กำหนดเองที่ฉันเพิ่งใส่เข้าไปเพราะปลั๊กอิน json-api ที่ดูเหมือนว่าเป็นที่นิยมนั้นไม่ได้ครอบคลุมประเภทโพสต์ที่กำหนดเอง
พายุ

คำตอบ:


17

Ajax Handler

ย่อมเป็นความสับสนเล็กน้อยว่าตัวจัดการ Ajax อยู่ในwp-admin/ไดเรกทอรี แต่ใช่คุณสามารถและควรใช้สำหรับคำขอที่ไม่ใช่ผู้ดูแลระบบเช่นกัน จากนั้นคุณลงทะเบียนจัดการสำหรับเบ็ดแทนที่จะเป็นปกติwp_ajax_nopriv_[action] wp_ajax_[action]ในกรณีนี้คุณจะต้องทำตามบรรทัดแรกadmin-ajax.phpเท่านั้นเนื่องจากการร้องขอที่ทำโดยผู้ใช้ที่ไม่ได้ลงชื่อเข้าใช้จะทำให้หน้าอยู่ประมาณ 50 บรรทัด

ดังนั้นลงทะเบียนฟังก์ชั่นสำหรับเบ็ดwp_ajax_nopriv_get_custom_post_dataและมันจะได้รับการเรียกถ้าคุณขอadmin-ajax.phpกับชุดพารามิเตอร์action get_custom_post_dataให้แน่ใจว่าได้โทรติดต่อdie()เมื่อสิ้นสุดการจัดการของคุณเองมิฉะนั้นค่าเริ่มต้นdie(-1)จะถูกส่งกลับ และยังลงทะเบียนรุ่นที่ลงชื่อเข้าใช้wp_ajax_get_custom_post_data(ไปยังฟังก์ชั่นจัดการเดียวกันไม่มีปัญหา) เนื่องจากหากคุณลงชื่อเข้าใช้เว็บไซต์ของคุณคุณจะไม่กดnoprivตะขอ

กำหนดค่าฝั่งเซิร์ฟเวอร์เป็น Javascript

เคล็ดลับในการส่งข้อมูลการกำหนดค่าฝั่งเซิร์ฟเวอร์ (เช่นadmin-ajax.phpURL) wp_localize_script()เป็น คุณผ่านอาร์เรย์ของคีย์และค่าต่างๆซึ่งจะรวมอยู่ในส่วนบนของหน้า นี่อาจถูกสร้างขึ้นครั้งแรกสำหรับสตริงที่แปลได้เท่านั้น แต่คุณสามารถใช้มันเพื่อส่งผ่านข้อมูลการกำหนดค่าได้เช่นกัน

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

storm_json_configคือชื่อหมายเลขอ้างอิง (ถ้าคุณต้องการ dequeue ในภายหลัง) storm_configเป็นชื่อของวัตถุ Javascript ที่จะมีข้อมูลของคุณ ดังนั้นไฟล์ Javascript แบบคงที่ของคุณสามารถมีบรรทัดเหมือนjQuery.post(storm_config.ajaxurl, ...)กัน

ดูเพิ่มเติมคำตอบ bueltge เพื่อคำถามที่คล้ายกัน

จาวาสคริปต์แบบคงที่จากปลั๊กอิน dir

โหลดไฟล์คง Javascript จาก dir wp_enqueue_script()ปลั๊กอินของคุณเองคุณใช้ ที่จะมีลักษณะเช่นนี้:

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

storm_jsonชื่อการจัดการอยู่ที่ไหนอีกครั้งจากนั้นคุณให้ลิงก์ไปยังไฟล์จากนั้นการอ้างอิง (สามารถnull) และจากนั้นหมายเลขเวอร์ชันที่จะเพิ่มหลังจากการร้องขอเพื่อเอาชนะเบราว์เซอร์แคชในการอัปเดต


คำตอบที่ดี นี่คือสิ่งที่ฉันสงสัยและดูเหมือนว่าฉันจะได้ทำงาน ตอนนี้ฉันสามารถเข้าถึง/wp-admin/admin-ajax.php?action=هaction] และรับผล json ปัญหาของฉันตอนนี้คือที่ที่จะวาง js เพื่อทำการโทร ajax เนื่องจากฉันต้องใส่ echo admin_url ('admin-ajax.php'); ในฐานะที่เป็น url ฉันไม่สามารถใส่มันลงในไฟล์ปลั๊กอิน js ของฉันได้ ดังนั้นฉันจะไปเกี่ยวกับการเข้าคิวมันได้อย่างไร ฉันไม่ต้องการพิมพ์สคริปต์ลงตรงกลางของหน้า
พายุ

@Storm: ฉันขยายคำตอบด้วยwp_localize_script()ซึ่งคุณสามารถใช้เพื่อส่งข้อมูลการกำหนดค่าจากฝั่งเซิร์ฟเวอร์ไปยังเบราว์เซอร์ (ปลายเล็ก: ถ้าคุณเพิ่ม@ไปเป็นผู้ใช้คนนั้นจะได้รับการแจ้งเตือนของการตอบของคุณดังนั้น. @Mike: I updated the titleจะทำให้แน่ใจว่าเขาเห็นความคิดเห็นของคุณ)
ม.ค. Fabry

ขอบคุณมัด ม.ค. ตอนนี้ฉันคิดว่าฉันเข้าใจแพคเกจทั้งหมด ฉันจะต้องทำเรื่องเล็ก ๆ น้อย ๆ กับมันทั้งหมดเพื่อให้เข้าใจอย่างเต็มที่ แต่คุณได้รับความช่วยเหลือที่ดี! คำตอบที่ยอมรับ =) btw ขอบคุณสำหรับ @ note แต่เมื่อฉันแสดงความคิดเห็นกับคำตอบของคุณตอนนี้คุณจะยังคงได้รับการแจ้งเตือนใช่ไหม
พายุ

@Storm: ใช่การแจ้งเตือนไปที่ผู้เขียนคำถามหรือคำตอบที่คุณแสดงความคิดเห็นและนอกจากนี้ยังสามารถไปยังผู้เข้าร่วมรายอื่นที่คุณพูดถึงใน @ -comment ดังนั้นฉันจึงได้รับการแจ้งเตือนของคุณ "ฟรี" แต่คุณจะไม่ได้รับข้อความนี้ถ้าฉันไม่ได้รวมคุณไว้ มีคำอธิบายที่ครบถ้วนเกี่ยวกับไซต์เมตาทั่วไปของเครือข่ายสแต็ก Exchange
Jan Fabry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.