ที่มาของปัญหาก็คือ ทำเว็บแบบ 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