ฉันควรใช้ประเภทโพสต์ที่กำหนดเองหรือตารางฐานข้อมูลที่กำหนดเองสำหรับการพัฒนาปลั๊กอิน?


38

ฉันค่อนข้างใหม่ในการเขียนปลั๊กอิน wordpress แต่ฉันได้เพิ่มขึ้นในส่วนลึกแล้วและฉันต้องการให้แน่ใจว่าฉันทำ "ถูกต้อง" ในโครงการใหญ่ที่กำลังจะมาถึง

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

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

โดยเฉพาะฉันกังวลเกี่ยวกับสามด้าน:

  • จำนวนโพสต์ metafields ที่ฉันต้องการสำหรับฟิลด์พิเศษของฉันต่อ cpt ถ้าฉันไปเส้นทางนั้นและหากนั่นจะทำให้สิ่งต่าง ๆ "ยุ่งยาก"
  • ฉันจะรับการสืบค้นกลับได้ดีเพียงใดโดยใช้ตัวกรองเชิงสัมพันธ์แบบกึ่งซับซ้อนสำหรับรายงาน
  • ทำอย่างไรจึงจะจัดการความสัมพันธ์ได้ดีที่สุดโดยเฉพาะถ้าฉันมีความสัมพันธ์หลายอย่าง

มีวิธี "ถูกต้อง" หรือไม่? ขอบคุณสำหรับข้อมูลของคุณ

คำตอบ:


59

คุณควรจะสงสัยใครก็ตามที่บอกว่ามีวิธี "ถูกต้อง" เดียว วิธีที่ถูกต้องขึ้นอยู่กับสถานการณ์ การใช้โครงสร้างพื้นฐาน CPT มีประโยชน์เด่น ๆ มากมาย:

  • คุณจะได้รับ Dashboard UI ได้ฟรี
  • คุณใช้ประโยชน์จากการแคชของ WP โดยอัตโนมัติรวมถึงปลั๊กอินแคชถาวรใด ๆ ที่การติดตั้งอาจใช้
  • คุณจะได้รับสินค้าโดยอัตโนมัติเช่นการแก้ไขโพสต์
  • คุณได้รับการเข้าถึงWP_Queryคลาสซึ่งหมายความว่าในทางทฤษฎีคุณไม่จำเป็นต้องเขียน SQL ใด ๆ (หรืออย่างน้อยไม่มาก) ที่น่าจะเป็นบั๊กกี้และอ่อนไหวและไม่มีประสิทธิภาพ
  • หากคุณวางแผนที่จะกระจายปลั๊กอินหรือเปิดขึ้นเพื่อการพัฒนาโอเพ่นซอร์สคุณอาจพบว่านักพัฒนามีความสะดวกสบายมากขึ้นเมื่อใช้ประเภทโพสต์ที่กำหนดเองและฟังก์ชั่น API ที่เกี่ยวข้องมากกว่าสิ่งที่คุณกำหนดเอง

ปัญหาเกี่ยวกับ CPT API ส่วนใหญ่เกิดจากข้อเท็จจริงที่ว่ามันแต่งงานอย่างมากกับคำอุปมาของ 'โพสต์' และทุกแง่มุมของประเภทข้อมูลนั้นที่มาพร้อมกับคำอุปมา จากบรรทัดคำสั่ง MySQL DESCRIBE wp_postsเรียกใช้ WP ถือว่าเนื้อหาของคุณมีชื่อเรื่องซึ่งมีผู้แต่ง (คนเดียว) ที่คุณจะต้องติดตามวันที่สร้างและวันที่แก้ไขครั้งล่าสุดเท่านั้นคุณจะต้องมีที่ว่างสำหรับการทำดัชนีpost_contentฯลฯ ดีสำหรับเนื้อหาบางประเภท แต่ไม่จำเป็นสำหรับผู้อื่น คุณได้สัมผัสกับปัญหาที่อาจเกิดขึ้นแล้ว:

จำนวนโพสต์ metafields ที่ฉันต้องการสำหรับฟิลด์พิเศษของฉันต่อ cpt ถ้าฉันไปเส้นทางนั้นและหากนั่นจะทำให้สิ่งต่าง ๆ "ยุ่งยาก"

มีสองวิธีในการเพิ่มwp_postsสคีมาผ่าน CPT API: postmeta และ taxonomies Postmeta เป็นคู่คีย์ - ค่าที่ไม่ได้จัดทำดัชนีซึ่งเหมาะสำหรับการจัดเก็บข้อมูลเบ็ดเตล็ดจำนวนมาก แต่ไม่เหมาะสำหรับการค้นหาที่ซับซ้อน Taxonomies มีความยืดหยุ่นมากกว่าในเรื่องนี้ แต่คุณยังต้องเผชิญกับคำถามย่อยที่อาจมีค่าใช้จ่ายสูงหากคุณมีการค้นหาที่ซับซ้อนมาก ( meta_queryและtax_queryข้อโต้แย้งและชั้นเรียนตัวสร้างแบบสอบถามของพวกเขาดีมากและมีประโยชน์ แต่)

หากตามที่คุณแนะนำคุณจะต้องทำ "ตัวกรองเชิงสัมพันธ์เชิงกึ่งซับซ้อน" เหล่านี้ในกรณีที่มีการรายงานเป็นครั้งคราวสถาปัตยกรรมนี้น่าจะเหมาะสมสำหรับคุณ เมื่อคุณเริ่มเปิดเผยตัวกรองแก่ผู้ใช้ดังนั้นคุณจะต้องเรียกใช้งานที่ซับซ้อนJOINและแบบสอบถามย่อยตลอดเวลาเพื่อให้สิ่งต่างๆหลุดมือไปอย่างรวดเร็ว

ทำอย่างไรจึงจะจัดการความสัมพันธ์ได้ดีที่สุดโดยเฉพาะถ้าฉันมีความสัมพันธ์หลายอย่าง

ความสัมพันธ์แบบหลายต่อหลายเป็นจุดยึดยาวนานในชุมชน WP dev (ดูhttps://core.trac.wordpress.org/ticket/14513 ) คุณสามารถปลอมมันได้โดยไม่ต้องใช้ตารางที่กำหนดเองโดยการแมปรายการ taxonomy ลงใน post_ids (เช่นคุณสามารถพูดได้ว่า 'P3 มีความสัมพันธ์ Y ถึง P5' โดยบอกว่า P3 มีแท็ก 'Y-P3') แต่สิ่งนี้ทำให้เกิดความสับสน (และไม่มีประสิทธิภาพ) อย่างรวดเร็วมาก คุณอาจพิจารณาสร้างตารางความสัมพันธ์ของคุณเองที่เชื่อมโยง CPT เข้าด้วยกัน - คุณยังคงได้รับประโยชน์จาก CPT และจะสร้างตาราง DB เดียวเท่านั้น สำหรับวิธีนี้ในเวอร์ชันที่ดำเนินการอย่างดีโปรดดูปลั๊กอินโพสต์โพสต์ 2: https://wordpress.org/extend/plugins/posts-to-posts/

ดังนั้นในที่สุดคุณควรตัดสินใจตาม:

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

หากคำตอบคือ: โพสต์มากไม่ซับซ้อนเกินไปและไม่ต้องขยายขนาดใหญ่เกินไปให้ไปกับ CPT มิฉะนั้นพิจารณาตารางของคุณเอง


3
สรุปยอดเยี่ยม
JCL1178

1
เพิ่มเป็นสองเท่า ตอบรับอย่างดี +1
kaiser

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

2
ซีรีส์นี้โดย Pippin Williamson คุ้มค่าที่จะอ่านหากคุณกำลังพิจารณาตารางที่กำหนดเอง: pippinsplugins.com/series/building-a-database-abstraction-layer
Travis Northcutt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.