วิธีสร้างปลั๊กอิน 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 .= '
แม้ว่าโค้ดนี้จะใช้งานได้และทำงานได้สำเร็จ แต่ก็ไม่สามารถขยายได้ค่อนข้างมาก
ทำไม? เนื่องจากฟังก์ชันได้รับการตั้งค่าในแบบของตัวเอง ไม่มีทางที่จะเปลี่ยนการทำงานโดยไม่แก้ไขโค้ดโดยตรง
จะเกิดอะไรขึ้นหากผู้ใช้ต้องการแสดงบทความมากกว่าสามบทความ หรืออาจรวมลิงก์ที่มีชื่อบทความไว้ด้วย ไม่มีทางทำได้ด้วยรหัสด้านบน ผู้ใช้ติดอยู่กับวิธีการทำงานของปลั๊กอินและไม่สามารถเปลี่ยนแปลงได้
การรวมการตั้งค่าหลายร้อยรายการไม่ใช่คำตอบ
มีหลายวิธีในการปรับปรุงปลั๊กอินด้านบนเพื่อให้ผู้ใช้สามารถปรับแต่งได้
วิธีหนึ่งคือการเพิ่มตัวเลือกจำนวนมากในการตั้งค่า แต่ถึงแม้จะไม่เป็นไปตามความเป็นไปได้ทั้งหมดที่ผู้ใช้ต้องการจากปลั๊กอิน
จะเกิดอะไรขึ้นหากผู้ใช้ต้องการทำสิ่งใดสิ่งหนึ่งต่อไปนี้ (สถานการณ์สมมติที่เราจะทบทวนในภายหลัง):
- แสดงผลิตภัณฑ์หรือโพสต์ของ 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 .= '
คุณสามารถรับรหัสด้านบนในไฟล์เก็บถาวร 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