ที่มาของปัญหาก็คือ ทำเว็บแบบ multi site อยู่ เป็นเว็บรวมร้านอาหาร ในเว็บแต่ละเว็บได้ติดตั้งปลักอินเปิดปิดร้านไว้ เพื่อเป็นตัวบอกว่าร้านปิดอยู่หรือร้านเปิดอยู่ ทีนี้ในหน้าหลักหรือตัวแม่ มีแสดงรายการร้านทั้งหมด และต้องการจะแสดงว่าร้านนี้ปิดร้านนี้เปิด
แต่พอไปเช็กฟังก์ชั่นของปลักอินที่เอามาใช้ ปรากฎว่า เขียนไว้ซะซับซ้อนเลย
ก็เลยคิดว่า ถ้าอย่างนั้นก็สร้าง API ขึ้นมาเพื่อให้ใครจากภายนอกรีเควสเข้ามาขอดูสถานะของร้านได้ โดยภายใน API ก็เรียกใช้ฟังก์ชั่นของปลักอินที่ว่าซับซ้อนนั่นอีกที
หน้าหลักเว็บแม่ ก็มาเรียกดูสถานะร้านผ่านทาง API เอา
โค้ดเป็นดังนี้
/**
* เพิ่ม API สำหรับตรวจเช็กสถานะของร้านค้าว่าเปิด/ปิด
*/
add_action('rest_api_init', 'knockknock_rest_api_init' );
function knockknock_rest_api_init() {
register_rest_route('shop', 'status', array(
'methods' => 'GET',
'callback' => 'knockknock_get_shop_status'
));
}
function knockknock_get_shop_status(){
if(function_exists('\Zhours\get_current_status')){
return \Zhours\get_current_status();
};
return true;
}
ตัวสำคัญก็คือ
add_action('rest_api_init', 'knockknock_rest_api_init' );
เป็นตัวบอกว่า เมื่อมีการเรียก API เข้ามาที่เว็บ ให้เรียกฟังก์ชั่น knockknock_rest_api_init ของเราด้วย
ในฟังก์ชั่น knockknock_rest_api_init จะบอก ให้ลงทะเบียน url /shop/status ให้เราด้วย และถ้าหากมีใครมาเรียก url นี้ผ่านทางเมธอด GET ให้ไปเรียกฟังก์ชั่น knockknock_get_shop_status ขึ้นมาทำงาน
register_rest_route('shop', 'status', array(
'methods' => 'GET',
'callback' => 'knockknock_get_shop_status'
));
ซึ่งภายในฟังก์ชั่น knockknock_get_shop_status จะบอกว่า สำรวจก่อนว่ามีการติดตั้งปลักอิน ไว้หรือไม่ ถ้ามี ให้เรียกใช้ฟังก์ชั่น get_current_status() ส่งค่าคืนกลับไป ซึ่งฟังก์ชั่นนี้เป็นตัวบอกได้ว่าร้านเปิดหรือร้านปิด
if(function_exists('\Zhours\get_current_status')){
return \Zhours\get_current_status();
};
เหตุที่ต้องเขียนฟังก์ชั่นในรูปแบบนี้เพราะว่า มันมีการประกาศ namespace ไว้ เรียกว่าคนเขียนฟังก์ชั่นนี้แกใช้เทคนิค namespace
\Zhours\get_current_status()
เรื่อง namespace สามารถหาอ่านในเว็บ PHP ได้ทั่วไปนะครับ หรือหาเอาใน google
Leave a Reply