Add your custom filter อยากมีฟิลเตอร์กะเค้าบ้าง

เคยมั๊ย ที่อยากให้ชาวบ้านมา hook filter ของเราได้บ้าง?

บางคนงงว่า filter คืออะไร แล้วใช้ทำไม แล้วมันต่างกับ action ยังงัย
คร่าวๆ action คือ event ต่างที่เกิดขึ้นเวลาบางสิ่งบางอย่างใน WordPress มันเกิดขึ้น เช่น กด save post แล้วจะเกิด action อะไรขึ้น เราสามารถ hook event ณ จุดนั้นได้ เป็นต้น

อ่ะอ่ะ.. filter ใน WordPress มันดูคล้ายกับ action แต่ไม่เหมือนกัน ตัว filter เป็นการส่ง data ไปยังจุดที่เกิดบางสิ่งบางอย่างขึ้นใน WordPress เช่น ตอน load content จะให้มี custom content ของเราเข้าไปด้วย เราก็ไป apply filter ให้ตรง the_content อะไรแบบนี้

ที่เกริ่นไปเกี่ยวกับ action และ filter คือ เราไป hook ตรง filter ที่ WordPress เค้ามีไว้ให้แล้ว ถ้าอยากรู้ว่าเราไป Hook อะไรได้บ้าง ก็ไปดูที่นี่ http://codex.wordpress.org/Plugin_API/Hooks

แล้วถ้าอยากมี custom filter ของตัวเองล่ะ.. แบบ WordPress ไม่มีให้ใช้น่ะ ทำงัย

สมมติเหตุการณ์ อยากส่ง parameter เป็นชื่อเพื่อน แล้วให้ปรินท์ออกมาว่า "[friend] is so bad"
ก่อนอื่น เรา add filter ของเรา ที่จะทำให้ปรินท์คำนี้ออกมา

function my_friend_is_bad ( $name ){
    return $name . " is so bad";
}
add_filter ( "bad_friend_filter", "my_friend_is_bad", 10, 1 ); //priority=10 (ปกติ) รับ parameter 1 ตัว

คราวนี้เวลาจะเอาไปใช้ ก็ทำแบบนี้

$name = 'James';
$output = apply_filters ( "bad_friend_filter", $name );

ถ้าเรา echo $output ออกมา สิ่งที่ได้คือ

James is so bad

ดูแค่นี้ ก็คงจะดูธรรมดา จะบอกว่าอีกประโยชน์นึงของ filter คือ สมมติว่าเราอยาก parse parameter ไปให้กับ action ใน WordPress โดยที่ไอ่ action ตัวนั้น มันไม่ได้รับ parameter อะไรเลย (หรือไม่ได้รับ pamameter ที่เราต้องการ) จะทำยังงัย???

สมมติเหตุการณ์ อยากให้ปรินท์อะไรบางอย่างออกมาตอนโหลดหน้า admin โดยข้อความแต่ละครั้งไม่เหมือนกันเลย เป็นข้อความเดียว หรือหลายข้อความ ก็แล้วแต่ (hard code ไม่ได้) โดยปกติเวลาเรียกคำสั่ง admin_init มันก็จะมีแค่นี้

function print_content (){
    return "hello";
}
add_action ( "admin_init", "print_content" );

จะเห็นว่า เรียกฟังก์ชั่นได้เฉยๆ ไม่ได้ส่งค่าอะไรเข้าไปได้ และ admin_init ไม่ได้กำหนดให้รับค่าอะไรได้

สมมติจะให้ส่ง parameter เข้าไปได้ เราก็จะทำแบบนี้เพิ่ม จะทำให้เราไม่ต้องแก้อะไรใน function print_content และไม่ต้อง parse parameter เลย

function many_content ( ){
    return array ("hello", "my", "friend");
}
add_filter ( "content_filter", "many_content");

function print_content (){
    //apply_filters แอบส่ง pamameter
    print_r( apply_filters ( "content_filter", "many_content") );
}
add_action ( "admin_init", "print_content" );

Mils Burasakorn

Mils Burasakorn