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() ได้เลยครับ

Posted by jirayu

WordPress Developer ที่พอมีประสบการณ์อยู่บ้าง วันไหนไม่ทำงานอยู่บ้านว่างๆ ก็นั่งเลี้ยงแมว

Leave a Reply

Your email address will not be published. Required fields are marked *