Hook ของเวิร์ดเพรสมันทำงานยังไง จะเล่าให้ฟัง

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

Hook ที่รุ่นพี่คนนั้นกล่าวถึงมันทำงานยังไง ผมจะเล่าให้ฟัง

แรกเริ่มทางวิศวกรซอฟแวร์ของเวิร์ดเพรสต้องการให้โปรแกรมเมอร์ทั่วๆไปสามารถเขียนโปรแกรมเติมเข้าไปในเวิร์ดเพรสได้โดยไม่ต้องแก้ไขโค้ดของเวิร์ดเพรส หลังจากคิดกันมานาน วิศวกรจึงสร้างฟังก์ชั่นขึ้นมาตัวนึงชื่อ do_action โดยฟังก์ชั่น do_action นี้จะรับพารามิเตอร์อย่างน้อยหนึ่งตัว อย่างมากกี่ตัวก็ได้ โดยพารามิเตอร์ตัวแรกนั้นจะใช้เป็นชื่อของ hook พารามิเตอร์ตัวอื่นๆ จะถูกส่งต่อไปให้กับ callable function  

เดี๋ยวจะเล่าให้ฟังว่าพารามิเตอร์ที่ส่งเข้าไปในฟังก์ชั่น do_action นั้นเขาเอาไว้ใช้ทำอะไร 

ภายในฟังก์ชั่น do_action นั้น เมื่อมันถูกรัน มันจะวิ่งเข้าไปตรวจดูใน array stack ตัวหนึ่งชื่อ $wp_actions  มันเข้าไปตรวจดูใน array stack ตัวนี้ว่า มีฟังก์ชั่นชื่ออะไร ลงทะเบียนไว้ตรงกับชื่อของ hook บ้าง ซึ่งก็คือตรงกับคำที่เป็นพารามิเตอร์ตัวแรก ถ้ามีมันก็จะเรียกฟังก์ชั่นนั้นขึ้นมาทำงาน โดยส่งพารามิเตอร์ทั้งหมดใน do_action ยกเว้นชื่อ hook ไปให้กับฟังก์ชั่นนั้น   ถ้ามีนะ

ดูตัวอย่าง do_action แบบมีพารามิเตอร์ตัวเดียวและแบบมีพารามิเตอร์หลายตัว

do_action('init');
do_action('wp_loaded');
do_action( 'deactivated_plugin', $plugin, $network_deactivating );

*** ชื่อ Hook เป็นคำที่เราตั้งขึ้นมาเอง โดยส่วนใหญ่จะใช้คำที่จำง่าย สอดคล้องกับตำแหน่งที่วางคำสั่ง do_action ไว้ 

หลังจากเราทราบแล้วว่าคำสั่ง do_action มันจะไปฟังก์ชันที่ลงทะเบียนไว้ตรงกับชื่อ hook เอามารัน แล้วฟังก์ชั่นที่ว่ามันเข้าไปอยู่ใน array stack ได้อย่างไร

วิศวกรซอฟแวร์ของเวิร์ดเพรสอีกนั่นแหละ เขียนฟังก์ชั่นตัวหนึ่งขึ้นมาชื่อ add_action  ให้เรานำเอาไปใช้เพื่อทำการลงทะเบียนฟังก์ชั่นของเราเข้าไปใน array stack โดยฟังก์ชั่น add_action นั้น จะต้องบอกว่า ฟังก์ชั่นชื่ออะไรที่จะให้เอาเข้าไปใส่ ชื่อ hook ชื่อว่าอะไร เอาไปใส่ไว้ลำดับที่เท่าไร และอยากจะรับพารามิเตอร์กี่ตัว 

จำนวนพารามิเตอร์ที่ต้องการรับนั้นจะต้องไม่น้อยกว่าที่มีอยู่ใน do_action นะครับ  มี 2 อยากเอาแค่ 1 ได้ มี 2 อยากเอาทั้ง 2 ได้ มี 2 อยากได้ 3 ไม่ได้

add_action( 'wp_head', 'wp_admin_bar_header' );
add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 );
add_action( 'set_comment_cookies', 'wp_set_comment_cookies', 10, 3 );

พารามิเตอร์ตัวที่ 1 คือชื่อของ hook
พารามิเตอร์ตัวที่ 2 คือชื่อฟังก์ชั่นที่ต้องการจะใส่เข้าไปใน array stack
พารามิเตอร์ตัวที่ 3 คือลำดับ ถ้าไม่มีให้ดีฟอลต์ไว้ที่ 10
พารามิเตอร์ตัวที่ 4 คือจำนวนพารามิเตอร์ที่ฟังก์ชั่นในพารามิเตอร์ตัวที่ 2 ต้องการรับ

หลังจากที่วิศวกรได้ออกแบบฟังก์ชั่น do_action ออกมาแล้ว เขาก็เอาไปใส่ไว้ในโค้ดของเวิร์ดเพรสตามที่ต่างๆ แล้วตั้งชื่อ hook ให้เป็น init บ้าง plugin_loaded บ้าง wp บ้าง ทำให้เราสามารถเขียนปลักอิน เอาฟังก์ชั่นของเราแทรกเข้าไปในโค้ดของเวิร์ดเพรสโดยไม่ต้องแก้โค้ดของเวิร์ดเพรส ผ่านทางฟังก์ชั่น add_action 

ต้องคารวะคนออกแนวความคิด

hook ที่กล่าวมาข้างบนเขาเรียกว่า action hook เพราะมันมีคำว่า action คราวหน้าผมจะมาเล่าการทำงานของ hook อีกตัวนึงชื่อ filter hook 

โปรดติดตาม