คุณต้องทำสามสิ่งสำคัญ:
- สร้างกฎการเขียน
index.php
ซ้ำแบบกำหนดเองเพื่อเปลี่ยนส่วนของ URI ให้เป็นค่าที่ส่งผ่านไป
- เพิ่ม
myroute
และเพิ่มmyargument
ตัวแปรการสืบค้นของรายการที่ปลอดภัยของ WordPress เพื่อให้ WordPress ไม่เพียง แต่เพิกเฉยเมื่อปรากฏในสตริงการสืบค้น
- ล้างกฎการเขียนซ้ำ
ประการแรกฉันจะแนะนำว่าแทนที่จะhttp://www.example.org/myroute/myargument
ให้คุณใช้คำนำหน้าหรือคำต่อท้ายแบบพิเศษเพื่อแสดงว่า URI ควรได้รับการพิจารณาว่าเป็นหนึ่งใน 'เส้นทาง' พิเศษเหล่านี้ สำหรับประโยชน์ของตัวอย่างนี้ฉันได้เลือกคำนำหน้าเพื่อที่ว่ามันจะเป็นapi
http://www.example.org/api/myroute/myargument
ฉันเลือกapi
เพราะเมื่อฉันทำสิ่งที่สงบเช่นเดียวกับที่คุณดูเหมือนจะทำงานมันเป็นสำหรับ API
รหัส
add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );
// flush_rules() if our rules are not yet included
function my_flush_rules() {
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
return $newrules + $rules;
}
// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
array_push( $vars, 'myroute', 'myargument' );
return $vars;
}
รายละเอียดด่วน
มันค่อนข้างตรงไปตรงมา รูปแบบ regex ถูกเพิ่มเข้าไปในรายการกฎการเขียนซ้ำทั้งหมดใน WordPress และรูปแบบที่กำหนดเองของคุณอยู่ด้านบนสุดของรายการ เมื่อรูปแบบจะถูกจับคู่ WordPress จะหยุดมองผ่านรายการของเขียนกฎและใช้ค่าจับ regex ในสถานที่ของการอ้างอิง ( $matches[1]
และ$matches[2]
) index.php
ในสตริงแบบสอบถามผ่านไป
การเพิ่มตัวแปรคิวรี่myroute
และmyargument
รายการที่อนุญาตทำให้ WordPress สนใจพวกเขามากกว่าที่จะละทิ้งมัน
วิธีอื่นในการ 'กำหนดเส้นทาง' เส้นทางที่กำหนดเองของคุณ
หากคุณต้องการหลีกเลี่ยงการใช้/api/
เป็นคำนำหน้าคุณสามารถใช้ตัวแปร / ฟิลด์สตริงการสืบค้นแทน ที่จะทำอะไรเช่นนั้นคุณจะเปลี่ยน regex เพื่อสิ่งที่ต้องการ(.*?)/(.+?)\\?api=1
แล้วเพิ่มapi
เป็นพารามิเตอร์เพิ่มเติมเพื่อการโทรที่เกิดขึ้นในarray_push()
my_insert_query_vars()
ที่จะเปลี่ยนเส้นทางที่กำหนดเองเพื่อที่จะก่อให้เกิดเวลาใดเป็นองค์ประกอบแรกของสตริงแบบสอบถามเช่นมันจะเรียกสำหรับapi=1
http://example.com/anytext/anytext?api=1
ไม่สนใจการใช้คำว่า 'namespacing' - ใช้เพื่อความกะทัดรัด
หากคุณไม่มี 'namespace' ที่มีคำนำหน้าหรือคำต่อท้ายคุณจะได้รูปแบบ URI ที่ขัดแย้งกัน เนื่องจาก WordPress จะไม่มีวิธีแยกแยะรูปแบบที่กำหนดเองของคุณจากจุดประสงค์เดียวเพื่อเป็นโพสต์หรือเพจ WordPress จะรู้ได้อย่างไรว่านั่นmyroute
ไม่ใช่ taxonomy, term หรือ parent page?
หวังว่านี่จะช่วยได้
my_insert_rewrite_rules
ตามคำจำกัดความตาม! เริ่มต้นด้วยกฎที่ยาวที่สุดก่อนจากนั้นทำงานให้ง่ายที่สุดมิฉะนั้น / api / myroute จะแทนที่ / api / myroute / myargument