Action และ Filter ใน WordPress ต่างกันอย่างไร?

ในเวิร์ดเพรสนั้นจะมีวิธี Hook การทำงานอยู่ 2 แบบ คือผ่าน Action และ Filter ซึ่งการทำงานของทั้ง Action และ Filter นี่มันคล้ายกันมาก … ไม่สิ จริงๆ มันเหมือนกันเลย!!
ไม่เชื่อลองไปเปิดไฟล์ wp-includes/plugin.php ดูแถวๆ บรรทัดที่ 400 กว่าๆ (ตอนนี้ 4.1.1 ก็อยู่ที่ 429) จะเจอการประกาศฟังก์ชันเอาไว้ดังนี้
function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { return add_filter($tag, $function_to_add, $priority, $accepted_args); }
ครับ add_action() มันก็เป็น wrapper ธรรมดาๆ ของ add_filter() นั่นแหละ … อ้าว! แล้วมันต่างกันยังไง?
ความต่างของ Action และ Filter
แม้ว่าการทำงานจะเหมือนกัน (ก็พี่ท่านทำงานด้วยฟังก์ชันเดียวกันเลยน่ะนะ) แต่สองอย่างนี้จะต่างกันในเชิงแนวคิดครับ อธิบายคร่าวๆ คือ
Action เอาไว้สำหรับ hook เข้าไประหว่างการทำงาน เพื่อที่จะเข้าไปทำงานอย่างอื่นระหว่างนั้น เช่นฮุคเข้าไปใน save_post เพื่อส่งอีเมลเตือนแอดมิน หรือฮุคเข้าไปตอน init เพื่อดึงไฟล์ javascript และ css
Filter เอาไว้สำหรับ hook เข้าไประหว่างการทำงาน เพื่อจัดการกับข้อมูลที่ถูกประมวลผลเอาไว้บ้างแล้ว เช่นการฮุคเข้าไปเพื่อ str_replace() (เช่นการกรองคำ) หรืออย่างในกรณีล่าสุดคือฮุคเข้าไปเพื่อแก้ไข featured image นั่นเอง
ก็นั่นแหละครับท่านผู้ชม ถ้าหากลองเข้าไปดูใน Action Reference และ Filter Reference จะพบว่าชื่อของ action จะบอกเอาไว้ในลักษณะของเป็นชื่อการทำงาน ในขนะที่ชื่อของ filter จะบอกเอาไว้ในลักษณะของส่วนข้อมูล
อ้อ ในลิงค์ข้างต้น ได้ระบุ action/filter เอาไว้เพียงแค่บางส่วนนะครับ ในกรณีที่เราอยากแก้ไขอะไรต่างๆ อ่านฟังก์ชันของ WordPress แล้วเกือบจะทำได้แต่ก็ไม่ได้ ให้ลองเปิด source หาฟังก์ชันนั้นๆ ดู แล้วสังเกตตรงคำสั่ง apply_filter() หรือ do_action() ครับ มันจะบอกชื่อ action/filter อยู่ เราสามารถฮุคเข้า action/filter นั้นๆ ผ่าน add_action() หรือ add_filter() ได้เลยครับ