วิธีสร้างปลั๊กอิน WordPress ที่ขยายได้

เผยแพร่แล้ว: 2022-03-10
สรุปอย่างย่อ ↬ เมื่อคุณคิดว่าในที่สุดคุณก็พบปลั๊กอินที่ทำทุกอย่างที่คุณต้องการแล้ว ยังมีสิ่งสำคัญเล็กๆ น้อยๆ ที่มันไม่สามารถทำได้ ค้นหาวิธีทำให้ปลั๊กอินของคุณขยายได้และลดอาการปวดหัว

คุณเคยใช้ปลั๊กอินและอยากให้มันทำอะไรที่แตกต่างออกไปบ้างไหม? บางทีคุณอาจต้องการบางสิ่งที่ไม่เหมือนใครซึ่งอยู่นอกเหนือขอบเขตของหน้าการตั้งค่าของปลั๊กอิน

ฉันเคยเจอสิ่งนี้เป็นการส่วนตัวและฉันพนันได้เลยว่าคุณก็มีเช่นกัน หากคุณเป็นนักพัฒนาปลั๊กอิน WordPress เป็นไปได้มากว่าผู้ใช้บางรายของคุณอาจประสบปัญหานี้ขณะใช้ปลั๊กอินของคุณ

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

ลองนึกภาพถ้าคุณเป็นผู้พัฒนาปลั๊กอินนี้ คุณจะทำอย่างไรถ้าผู้ใช้ขอฟังก์ชันบางอย่าง?

สิ่งที่เหมาะคือการนำไปใช้ แต่ถ้าคุณลักษณะนี้มีไว้สำหรับกรณีการใช้งานที่พิเศษมาก การเพิ่มคุณลักษณะนี้จะไม่สามารถใช้งานได้จริง ไม่ควรมีการตั้งค่าปลั๊กอินที่ผู้ใช้เพียง 0.1% เท่านั้นที่จะใช้ได้

คุณต้องการใช้คุณลักษณะที่ส่งผลต่อผู้ใช้ส่วนใหญ่ของคุณเท่านั้น ในความเป็นจริง ผู้ใช้ 80% ใช้คุณลักษณะ 20% (กฎ 80/20) ดังนั้น ตรวจสอบให้แน่ใจว่าคุณลักษณะใหม่ ๆ นั้นได้รับการร้องขออย่างมาก และ 80% ของผู้ใช้ของคุณจะได้รับประโยชน์จากคุณลักษณะนี้ ก่อนนำไปใช้จริง หากคุณสร้างการตั้งค่าสำหรับทุกฟีเจอร์ที่ร้องขอ ปลั๊กอินของคุณจะซับซ้อนและบวมขึ้น และไม่มีใครต้องการ

ทางออกที่ดีที่สุดของคุณคือทำให้ปลั๊กอินสามารถขยายได้ ใช้โค้ดอย่างชาญฉลาด เพื่อให้ผู้อื่นสามารถปรับปรุงหรือปรับเปลี่ยนได้ตามความต้องการของตนเอง

ในบทความนี้ คุณจะได้เรียนรู้ว่าเหตุใดการทำให้ปลั๊กอินสามารถขยายได้จึงเป็นแนวคิดที่ดี ฉันจะแบ่งปันเคล็ดลับบางประการเกี่ยวกับวิธีที่ฉันได้เรียนรู้ที่จะทำเช่นนี้

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

อะไรทำให้ปลั๊กอินขยายได้?

โดยสรุป ปลั๊กอินแบบขยายได้หมายความว่าจะยึดตามส่วน "O" ของหลักการ SOLID ของการเขียนโปรแกรมเชิงวัตถุ กล่าวคือ หลักการเปิด/ปิด

หากคุณไม่คุ้นเคยกับหลักการเปิด/ปิด โดยทั่วไปหมายความว่า บุคคลอื่นไม่ควรต้องแก้ไขรหัสของคุณเพื่อแก้ไขบางสิ่ง

การใช้หลักการนี้กับปลั๊กอิน WordPress หมายความว่าปลั๊กอินสามารถขยายได้หากมีข้อกำหนดที่ช่วยให้ผู้อื่นสามารถปรับเปลี่ยนพฤติกรรมได้ เหมือนกับที่ WordPress อนุญาตให้ผู้คน "เชื่อมต่อ" ในส่วนต่างๆ ของ WordPress แต่อยู่ที่ระดับของปลั๊กอิน

ตัวอย่างทั่วไปของปลั๊กอิน

มาดูกันว่าเราจะสร้างปลั๊กอินขยายได้อย่างไร โดยเริ่มจากตัวอย่างปลั๊กอินที่ไม่ใช่

สมมติว่าเรามีปลั๊กอินที่สร้างวิดเจ็ตแถบด้านข้างที่แสดงชื่อเรื่องของโพสต์ล่าสุดสามรายการ หัวใจสำคัญของปลั๊กอินคือฟังก์ชันที่รวมหัวเรื่องของสามโพสต์ไว้ในแท็กรายการ:

 function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
    '; foreach ( $ โพสต์เป็น $ โพสต์ ) { $output .= '
  • ' . $post->post_title '
  • '; } $output .= '
'; ส่งคืน $output; }

แม้ว่าโค้ดนี้จะใช้งานได้และทำงานได้สำเร็จ แต่ก็ไม่สามารถขยายได้ค่อนข้างมาก

ทำไม? เนื่องจากฟังก์ชันได้รับการตั้งค่าในแบบของตัวเอง ไม่มีทางที่จะเปลี่ยนการทำงานโดยไม่แก้ไขโค้ดโดยตรง

จะเกิดอะไรขึ้นหากผู้ใช้ต้องการแสดงบทความมากกว่าสามบทความ หรืออาจรวมลิงก์ที่มีชื่อบทความไว้ด้วย ไม่มีทางทำได้ด้วยรหัสด้านบน ผู้ใช้ติดอยู่กับวิธีการทำงานของปลั๊กอินและไม่สามารถเปลี่ยนแปลงได้

การรวมการตั้งค่าหลายร้อยรายการไม่ใช่คำตอบ

มีหลายวิธีในการปรับปรุงปลั๊กอินด้านบนเพื่อให้ผู้ใช้สามารถปรับแต่งได้

วิธีหนึ่งคือการเพิ่มตัวเลือกจำนวนมากในการตั้งค่า แต่ถึงแม้จะไม่เป็นไปตามความเป็นไปได้ทั้งหมดที่ผู้ใช้ต้องการจากปลั๊กอิน

จะเกิดอะไรขึ้นหากผู้ใช้ต้องการทำสิ่งใดสิ่งหนึ่งต่อไปนี้ (สถานการณ์สมมติที่เราจะทบทวนในภายหลัง):

  • แสดงผลิตภัณฑ์หรือโพสต์ของ WooCommerce จากหมวดหมู่เฉพาะ
  • แสดงรายการในวงล้อที่จัดเตรียมโดยปลั๊กอินอื่น แทนที่จะเป็นรายการธรรมดา
  • ดำเนินการแบบสอบถามฐานข้อมูลแบบกำหนดเอง แล้วใช้โพสต์ของแบบสอบถามเหล่านั้นในรายการ

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

นอกจากนี้ ปลั๊กอินที่มีรายการการตั้งค่าจำนวนมากนั้นไม่เป็นมิตรกับผู้ใช้อย่างแน่นอน หลีกเลี่ยงเส้นทางนี้ถ้าเป็นไปได้

แล้วเราจะแก้ไขปัญหานี้อย่างไร? เราจะทำให้ปลั๊กอินสามารถขยายได้

เพิ่มตะขอของเราเองเพื่อให้ขยายได้

จากการศึกษาโค้ดของปลั๊กอินด้านบน เราจะเห็นการดำเนินการบางอย่างที่ฟังก์ชันหลักดำเนินการ:

  • รับโพสต์โดยใช้ get_posts
  • มันสร้างรายชื่อของโพสต์
  • ส่งคืนรายการที่สร้างขึ้น

ถ้าคนอื่นต้องแก้ไขพฤติกรรมของปลั๊กอินนี้ งานของพวกเขาส่วนใหญ่จะเกี่ยวข้องกับการดำเนินการทั้งสามนี้ ในการทำให้ปลั๊กอินของเราสามารถขยายได้ เราจะต้องเพิ่ม hook รอบ ๆ เหล่านี้เพื่อเปิดขึ้นสำหรับนักพัฒนาคนอื่นๆ

โดยทั่วไป นี่เป็นส่วนที่ดีในการเพิ่ม hook ให้กับปลั๊กอิน:

  • รอบและภายในกระบวนการที่สำคัญ
  • เมื่อสร้างเอาต์พุต HTML
  • สำหรับแก้ไขข้อความค้นหาหรือฐานข้อมูล
  • ก่อนส่งกลับค่าจากฟังก์ชัน

ตัวอย่างทั่วไปของปลั๊กอินที่ขยายได้

ด้วยหลักการง่ายๆ เหล่านี้ เราสามารถเพิ่มตัวกรองต่อไปนี้เพื่อทำให้ปลั๊กอินของเราสามารถขยายได้:

  • เพิ่ม myplugin_get_posts_args เพื่อแก้ไขอาร์กิวเมนต์ของ get_posts
  • เพิ่ม myplugin_get_posts เพื่อแทนที่ผลลัพธ์ของ get_posts
  • เพิ่ม myplugin_list_item เพื่อกำหนดการสร้างรายการเอง
  • เพิ่ม myplugin_get_some_post_titles เพื่อแทนที่รายการที่สร้างขึ้นที่ส่งคืน

นี่คือรหัสอีกครั้งโดยเพิ่ม hooks ทั้งหมดใน:

 function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
    '; foreach ( $ โพสต์เป็น $ โพสต์ ) { // ให้คนอื่นแก้ไขรายการ $output .= '
  • ' . Apply_filters( 'myplugin_list_item', $post->post_title, $post ) '
  • '; } $output .= '
'; // ให้คนอื่นแก้ไขรายการผลลัพธ์ของเรา ส่งคืน apply_filters( 'myplugin_get_some_post_titles', $output, $args ); }

คุณสามารถรับรหัสด้านบนในไฟล์เก็บถาวร GitHub

ฉันกำลังเพิ่ม hooks จำนวนมากที่นี่ ซึ่งอาจดูเหมือนใช้งานไม่ได้เพราะโค้ดตัวอย่างค่อนข้างเรียบง่ายและเล็ก แต่แสดงให้เห็นจุดของฉัน: การเพิ่มเพียงสี่ hooks นักพัฒนารายอื่นๆ สามารถปรับแต่งพฤติกรรมของปลั๊กอินได้ในทุกวิถีทาง

เนมสเปซและบริบทสำหรับตะขอ

ก่อนดำเนินการต่อ ให้สังเกตสิ่งสำคัญสองประการเกี่ยวกับ hooks ที่เราได้ดำเนินการ:

  • เรากำลังเนมสเปซ hooks ด้วย myplugin_
    เพื่อให้แน่ใจว่าชื่อของ hook จะไม่ขัดแย้งกับ hook ของปลั๊กอินอื่น นี่เป็นเพียงแนวทางปฏิบัติที่ดี เพราะหากเรียกเบ็ดอื่นที่มีชื่อเดียวกัน อาจทำให้เกิดผลที่ไม่พึงประสงค์ได้
  • เรากำลังส่งการอ้างอิงถึง $args ใน hooks ทั้งหมดสำหรับบริบท
    ฉันทำเช่นนี้เพื่อที่ว่าหากผู้อื่นใช้ตัวกรองนี้เพื่อเปลี่ยนแปลงบางสิ่งในลำดับขั้นตอนของโค้ด พวกเขาสามารถใช้พารามิเตอร์ $args นั้นเป็นข้อมูลอ้างอิงเพื่อให้เข้าใจว่าเหตุใดจึงเรียก hook เพื่อให้พวกเขาทำการปรับเปลี่ยนตามนั้นได้

ผลกระทบของตะขอของเรา

จำสถานการณ์เฉพาะที่ฉันพูดถึงก่อนหน้านี้ได้ไหม ลองทบทวนสิ่งเหล่านั้นและดูว่าตะขอของเราทำให้มันเป็นไปได้อย่างไร:

  • หากผู้ใช้ต้องการ แสดงผลิตภัณฑ์หรือโพสต์ของ WooCommerce จากหมวดหมู่ใดหมวดหมู่ หนึ่ง พวกเขาสามารถใช้ตัวกรอง myplugin_get_posts_args เพื่อเพิ่มอาร์กิวเมนต์ของตนเองเมื่อปลั๊กอินค้นหาโพสต์ หรือใช้ myplugin_get_posts เพื่อแทนที่โพสต์ด้วยรายการของตนเองโดยสมบูรณ์
  • หากผู้ใช้ต้องการ แสดงรายการในรูปแบบภาพหมุนที่มีให้โดยปลั๊กอินอื่น แทนที่จะเป็นรายการธรรมดา พวกเขาสามารถแทนที่ผลลัพธ์ทั้งหมดของฟังก์ชันด้วย myplugin_get_some_post_titles และส่งออกภาพหมุนจากที่นั่นแทน
  • ถ้าผู้ใช้ต้องการ ดำเนินการสืบค้นฐานข้อมูลแบบกำหนดเอง แล้วใช้โพสต์ของแบบสอบถามนั้นในรายการ คล้ายกับสถานการณ์แรก พวกเขาสามารถใช้ myplugin_get_posts เพื่อใช้การสืบค้นฐานข้อมูลของตนเองและเปลี่ยนอาร์เรย์ของโพสต์ได้

ดีขึ้นมาก!

ตัวอย่างการใช้ฟิลเตอร์ของเราอย่างรวดเร็ว

นักพัฒนาสามารถใช้ add_filter เพื่อเชื่อมต่อกับตัวกรองของเราด้านบน (หรือใช้ add_action สำหรับการดำเนินการ)

จากสถานการณ์แรกของเราข้างต้น นักพัฒนาสามารถทำสิ่งต่อไปนี้เพื่อแสดงผลิตภัณฑ์ WooCommerce โดยใช้ตัวกรอง myplugin_get_posts_args ที่เราสร้างขึ้น:

 add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }

เรายังใช้ Action Hooks ได้อีกด้วย

นอกจากการใช้ apply_filters แล้ว เรายังสามารถใช้ do_action เพื่อทำให้โค้ดของเราขยายได้ ความแตกต่างระหว่างสองสิ่งนี้คือ ตัวแปรแรกอนุญาตให้ผู้อื่นเปลี่ยนตัวแปร ในขณะที่ตัวหลังอนุญาตให้ผู้อื่นดำเนินการฟังก์ชันเพิ่มเติมในส่วนต่างๆ ของโค้ดของเรา

เมื่อใช้การกระทำ เรากำลังเปิดเผยโฟลว์ของปลั๊กอินแก่นักพัฒนารายอื่น และปล่อยให้พวกเขาทำสิ่งอื่นควบคู่กันไป

อาจไม่มีประโยชน์ในตัวอย่างของเรา (เพราะเราแสดงเพียงรหัสย่อ) แต่จะมีประโยชน์ในอื่นๆ ตัวอย่างเช่น ด้วยปลั๊กอินสำรองที่ขยายได้ เราสามารถสร้างปลั๊กอินที่อัปโหลดไฟล์สำรองไปยังบริการของบุคคลที่สาม เช่น Dropbox

"ยอดเยี่ยม! แต่ทำไมฉันจึงควรใส่ใจเกี่ยวกับการขยายปลั๊กอินของฉัน”

ถ้าคุณยังไม่ขายแนวคิดนี้ ต่อไปนี้คือความคิดบางประการว่าทำไมการอนุญาตให้ผู้อื่นปรับเปลี่ยนพฤติกรรมของปลั๊กอินของคุณจึงเป็นความคิดที่ดี

มันเปิดปลั๊กอินเพื่อเพิ่มความเป็นไปได้ในการปรับแต่งเพิ่มเติม

ทุกคนมีความต้องการที่แตกต่างกัน และมีโอกาสสูงที่ปลั๊กอินของคุณจะไม่ตอบสนองทุกความต้องการ และคุณไม่สามารถคาดหวังได้ การเปิดปลั๊กอินของคุณเพื่อให้สามารถปรับเปลี่ยนส่วนสำคัญของพฤติกรรมของปลั๊กอินสามารถทำสิ่งมหัศจรรย์ได้

อนุญาตให้ผู้คนแนะนำการปรับเปลี่ยนโดยไม่ต้องแตะรหัสของปลั๊กอิน

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

หากเราเพิ่ม hooks ของเราเองเพื่อให้ผู้อื่นใช้ การปรับเปลี่ยนของปลั๊กอินสามารถวางในตำแหน่งภายนอกได้ เช่น ในปลั๊กอินอื่น ด้วยวิธีนี้ ปลั๊กอินดั้งเดิมจะไม่ถูกแตะต้องเลย และสามารถอัปเดตได้อย่างอิสระโดยไม่ทำลายสิ่งใด และการปรับเปลี่ยนทั้งหมดในปลั๊กอินอื่น ๆ จะยังคงเหมือนเดิม

บทสรุป

ปลั๊กอินที่ขยายได้นั้นยอดเยี่ยมจริงๆ และทำให้เรามีพื้นที่สำหรับความเป็นไปได้ในการปรับแต่งมากมาย หากคุณทำให้ปลั๊กอินของคุณขยายได้ ผู้ใช้และนักพัฒนาคนอื่นๆ จะรักคุณ

ดูปลั๊กอินเช่น WooCommerce, Easy Digital Downloads และ ACF ปลั๊กอินเหล่านี้สามารถขยายได้ และคุณสามารถบอกได้อย่างง่ายดายเนื่องจากปลั๊กอินอื่น ๆ มากมายในไดเรกทอรีปลั๊กอินของ WordPress เพิ่มฟังก์ชันการทำงานให้กับปลั๊กอินเหล่านี้ พวกเขายังจัดเตรียมแอคชั่นและตัวกรองเบ็ดมากมายที่ปรับเปลี่ยนแง่มุมต่าง ๆ ของปลั๊กอิน กฎง่ายๆ ที่ผมได้แจกแจงไว้ข้างต้นได้เกิดขึ้นในการศึกษาของผมแล้ว

ต่อไปนี้คือข้อควรปฏิบัติบางประการในการทำให้ปลั๊กอินของคุณขยายได้:

  • ปฏิบัติตามหลักการเปิด/ปิด คนอื่นไม่ควรต้องแก้ไขรหัสของคุณเพื่อแก้ไขบางอย่าง
  • ในการทำให้ปลั๊กอินของคุณขยายได้ ให้เพิ่ม hooks ในตำแหน่งเหล่านี้:

    • รอบและภายในกระบวนการที่สำคัญ
    • เมื่อสร้างเอาต์พุต HTML
    • สำหรับแก้ไขข้อความค้นหาหรือฐานข้อมูล
    • ก่อนส่งกลับค่าจากฟังก์ชัน

  • เนมสเปซชื่อ hooks ของคุณด้วยชื่อปลั๊กอินเพื่อป้องกันความขัดแย้งในการตั้งชื่อ
  • ลองส่งผ่านตัวแปรอื่นๆ ที่เกี่ยวข้องกับ hook เพื่อให้คนอื่นเข้าใจบริบทของสิ่งที่เกิดขึ้นใน hook
  • อย่าลืมบันทึก hooks ของปลั๊กอินเพื่อให้ผู้อื่นสามารถเรียนรู้ได้

อ่านเพิ่มเติม

ต่อไปนี้เป็นแหล่งข้อมูลบางส่วนหากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการขยายปลั๊กอิน:

  • วิธีทำให้ปลั๊กอิน WordPress ของคุณขยายได้, GitHub
    โค้ดตัวอย่างทั้งหมดในบทความนี้
  • "เคล็ดลับที่เป็นประโยชน์ในการเริ่มต้นใช้งาน WordPress Hooks" Thomas Maier จาก Smashing Magazine
  • "วิธีสร้างปลั๊กอิน WordPress" Daniel Pataki จาก Smashing Magazine
  • "Hooks" คู่มือปลั๊กอิน WordPress.org