การกำหนดเส้นทางบน WordPress ทำงานอย่างไร


13

core wp routing ทำงานอย่างไร? ฉันมีความเข้าใจที่ยากลำบาก ... ใน MVC URL ของคุณดูเหมือน mycontroller / myaction ที่แมปไปยัง MyController-> myaction ()

ใน drupal มันคือ index.php? q = mycustomerpath / hello ซึ่งสามารถแมปกับฟังก์ชั่นที่คุณชอบที่จะส่งคืนเนื้อหาที่ "แกน" ในรูปแบบธีมของคุณ

แต่ใน wp ฉันไม่มีเงื่อนงำว่าจะทำสิ่งต่าง ๆ ได้อย่างไร ... มันคืออะไร p = 1 แล้ว? ผลิตภัณฑ์ = 1 ... ฉันได้ค้นหาเอกสารของขั้นตอนการกำหนดเส้นทาง แต่ไม่พบสิ่งใด (google เพิ่งส่งคืนบทความตามที่กำหนดเอง) เส้นทาง) .. ฉันต้องการเข้าใจพื้นฐานของเส้นทางสายหลักก่อน ..


ขุดในรหัสฉันเห็นคำขอแต่ละครั้งมันเรียก query_posts? ทำไมบนโลกนี้จึงต้องค้นหาโพสต์ทุกครั้ง ไม่มีกรณีที่คุณไม่ต้องการแสดงโพสต์จริงหรือ
Yeahman

1
เนื้อหาจะถูกบันทึกเป็นโพสต์ใน WP ดังนั้นเมื่อคุณต้องการแสดงเนื้อหาคุณจำเป็นต้องค้นหา
Sisir

ฉันขอแนะนำให้คุณอ่านเกี่ยวกับ "the loop" ซึ่งเป็นแนวคิดที่คุณต้องเข้าใจเพื่อให้รู้ว่า WordPress ทำงานอย่างไร Essential "the loop" แสดงอาร์เรย์ของการโพสต์ซึ่งเป็นผลลัพธ์ของ query_posts สำหรับคำขอ URL ที่ไม่ใช่ผู้ดูแลระบบ WP ได้รับการออกแบบมาเพื่อแสดงเฉพาะโพสต์และใช้การเขียนโปรแกรมแบบกำหนดเองเพื่อแสดงบางสิ่งนอกเหนือจากโพสต์ คำขอ URL ผู้ดูแลระบบจะแตกต่างกันและสิ่งเหล่านี้ไม่ได้ใช้ "การวนซ้ำ" และแสดงสิ่งที่ไม่โพสต์

ตกลง แต่วิธีการนี้ค่อนข้างแปลกและไม่ยืดหยุ่นมาก tbh
yeahman

บอกว่าฉันต้องการที่จะแสดงรูปแบบการติดต่อ .. ฉันต้องใส่ html ของฉันในประเภทเนื้อหาของหน้า? ฉันยังคงพยายามหาตำแหน่งที่จะวางตรรกะสำหรับการส่งแบบฟอร์ม ... (ในหน้าธีม. php? วิธีการที่น่าเกลียดมาก)
yeahman

คำตอบ:


20

ใน WordPress URL จะไม่จับคู่กับเส้นทาง พวกเขาแมปแบบสอบถามฐานข้อมูล

เมื่อใช้ WordPress ในโหมด "เริ่มต้น" ลิงก์ถาวรคุณมีชุดของตัวแปรในการสืบค้น URL หลักเช่น? p = 1 หรือ? page = 234 เป็นต้น นอกจากนี้ยังมี? s = การค้นหาและอื่น ๆ อีกมากมาย

หากคุณใช้ permalinks "สวย" แล้วชุดใหญ่ของกฎที่เรียกว่า "กฎการเขียนซ้ำ" จะถูกสร้างขึ้นซึ่งแมปรูปแบบ URL ต่างๆโดยตรงกับพารามิเตอร์ URL ชุดเดียวกันนี้ ดังนั้น URL เช่น / 2014/04/12 / ตัวอย่างจะจับคู่กับ? year = 2014 & month = 04 & day = 12 & postname = example หรือคล้ายกัน ดังนั้นสิ่งต่อไปนี้ใช้กับสิ่งเหล่านี้เช่นกันหลังจากการทำแผนที่นี้เสร็จสิ้น

ตัวแปรเหล่านี้ควบคุมอินสแตนซ์หลักของคลาส WP_Query เป็นหลัก คลาส WP_Query เก็บข้อมูลทั้งหมดที่สร้างแบบสอบถามฐานข้อมูลเพื่อรับ "โพสต์" จากฐานข้อมูล พารามิเตอร์ต่างๆที่ส่งผ่านเข้าไปควบคุมประเภทของเคียวรีที่สร้างและข้อมูลที่ได้รับ

ดูทุกสิ่งที่ WordPress สามารถแสดงได้นั้นเป็น "โพสต์" บล็อกคือชุดของโพสต์ในลำดับตามเวลาย้อนกลับ "หน้า" เป็นโพสต์สแตติกที่มีชื่อที่กำหนดไว้ "โพสต์ที่กำหนดเองประเภท" เป็นสิ่งที่ดูเหมือนว่า "โพสต์" กับประเภทที่กำหนดเองที่คุณกำหนด ข้อความค้นหาหลักทั้งหมดเพื่อแสดงอะไรใน WordPress กำลังได้รับส่วนย่อยของโพสต์จากตาราง wp_posts

WP_Query คือสิ่งที่ทำ และพารามิเตอร์จาก URL จะถูกส่งโดยตรงไปยังคิวรีหลักนั้นและใช้ที่นั่น

ชุดรูปแบบจะกำหนดแม่แบบที่จะใช้โดยขึ้นอยู่กับสิ่งที่แบบสอบถามกลับมา หากคุณร้องขอ / category / example นั่นจะกลายเป็น? category_name = example ซึ่งหมายความว่าอาร์เรย์ $ wp_query-> query_vars หลักจะได้รับข้อมูลนั้นและ WP_Query จะดึงโพสต์ X สุดท้ายสำหรับหมวดหมู่ "ตัวอย่าง" และมัน จะตั้งค่าสถานะ is_category เป็นจริง

เทมเพลตโหลดเดอร์จะทำงานหลังจากนี้ดูว่า is_category () จะคืนค่าจริงและตัดสินใจเลือกเทมเพลตหมวดหมู่ดังนั้นมันจะมองหา category-example.php และถอยกลับไปที่ category.php และอื่น ๆ ตามเทมเพลต ลำดับชั้น

ดังนั้นคำถามหากคุณต้องการเปลี่ยนวิธีการทำงานของ URL อย่างง่าย: คุณต้องการเปลี่ยน URL หรือสิ่งที่ถูกแมปไปหรือไม่ เนื่องจาก URL ไม่ได้ถูกแมปเข้ากับฟังก์ชันพวกเขาจึงถูกแมปกับพารามิเตอร์ที่ควบคุมการสืบค้น หากคุณต้องการให้ URL ปรับการสืบค้นหลักนั้นก็เป็นกระบวนการที่แตกต่างกันเล็กน้อยถ้าคุณต้องการให้ URL พิเศษเรียกใช้รหัสพิเศษอื่นทั้งหมด

และเพื่อตอบคำถามเฉพาะของคุณในความคิดเห็น: "ไม่มีกรณีที่คุณไม่ต้องการแสดงบทความหรือไม่" ไม่ไม่มี ทุกอย่างคือโพสต์ เนื้อหาทั้งหมดถูกเก็บไว้ในโพสต์ หากคุณต้องการจัดเก็บเนื้อหาจากที่อื่นและแตกต่างคุณสามารถทำได้ แต่มันยากกว่าเพราะโดยความจริงแล้วปกติแล้วมันไม่จำเป็น หากคุณมีเนื้อหาพิเศษให้สร้างประเภทโพสต์ที่กำหนดเองจัดเก็บเนื้อหาของคุณเป็นโพสต์ที่มีประเภทนั้นแมปรูปแบบ URL ไปที่มัน ง่าย.


ฉันเข้าใจว่าทุกอย่างควรจะแสดงในโพสต์ (ผ่านโพสต์ประเภทที่กำหนดเอง ฯลฯ .. ) คล้ายกับประเภทที่กำหนดเองใน drupal 6 ... แต่มันส่งผลกระทบต่อประสิทธิภาพการทำงานที่มีตารางโพสต์เดียวเพื่อเก็บเนื้อหาทุกเว็บไซต์หรือไม่ drupal 7 แก้ไขได้โดยการแนะนำประเภทเอนทิตีเพื่อให้คุณไม่ต้องสร้างประเภทที่กำหนดเองและเก็บทุกอย่างในตารางโหนด แต่ในตารางเอนทิตีของคุณเองซึ่งยังสามารถใช้ประโยชน์จากกรอบงาน drupal ฉันหวังว่า wordpress จะแนะนำวิธีการดังกล่าวในอนาคต ขอบคุณสำหรับคำอธิบายรายละเอียด
yeahman

ฉันเดาว่าฉันต้องการแมป url กับฟังก์ชั่น / ธีมของฉันเองเราเตอร์ wp จะช่วยไหม?
yeahman

โดยปกติแล้วไม่จำเป็นต้องเพิ่มระบบการกำหนดเส้นทางแบบเต็ม มีวิธีที่ง่ายกว่า พื้นฐานของ WordPress คือการแสดงเนื้อหาที่ผู้ใช้สร้างขึ้นซึ่งเก็บไว้ในตารางโพสต์ หากคุณต้องการแสดงเนื้อหาที่ไม่ได้สร้างโดยผู้ใช้โดยทั่วไปแล้วคุณจะทำเนื้อหานั้นในธีมหรือในปลั๊กอิน มีตะขอแอ็คชันและตัวกรองจำนวนหลายร้อย (พัน) และวิธีอื่น ๆ สำหรับโค้ดในการแทนที่ส่วนต่าง ๆ ของกระบวนการเมื่อสร้างเพจ และด้วยสิ่งต่าง ๆ เช่นรหัสย่อการแทรก html ที่กำหนดเองลงในเนื้อหานั้นค่อนข้างง่าย
อ็อตโต

ฉันจะเพิ่ม html / php ที่กำหนดเองลงในประเภทโพสต์ที่ฉันสร้างได้อย่างไร โดยไม่ต้องมีการปรับเปลี่ยนรูปแบบของ single.php หรือสร้างเดียว mycustompost.php (ไม่ได้เป็นวิธีการแบบพกพามาก)
yeahman

7
หลังจากใช้งาน WordPress มานานกว่า 1 ปีแล้ว ... ฉันยังไม่เชื่อ ... กรอบงานนั้นไม่สวยงามและน่าเกลียดมาก ... มันใช้งานได้เหมือนบล็อกง่าย ๆ แต่ถ้าคุณต้องการพัฒนาเว็บไซต์ประเภทอื่น ๆ มันเป็นการแฮ็ค WordPress ที่ทำสิ่งที่ไม่ได้ตั้งใจทำ
ใช่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.