ที่มาที่ไปของความต้องการนี้คือ ต้องการเก็บ google uid พ่วงไปในแต่ละออร์เดอร์ เพื่อให้ทราบว่าออเดอร์นั้นๆเป็นของ uid ไหน ตอนหลังเมื่อรายการออเดอร์นั้นๆเปลี่ยนสถานะเป็นสำเร็จ จะยิงข้อมูลส่งไปให้ google analytic

ยัดฟิลด์ลงไปในหน้าออเดอร์ พอตอนสร้างออเดอร์ก็เอาฟิลด์ที่เพิ่มเข้าไปลงไปเก็บในดาต้าเบส

พาร์ทนี้ผมจะแสดงวิธีเพิ่มฟิลด์เข้าไปในฟอร์มหน้าจ่ายเงิน ผลลัพธ์หน้าตาแบบนี้

Extra field on woocommerce checkout

เริ่มที่ WooCommerce เขามี hook ชื่อ woocommerce_after_order_notes ให้ใช้งาน hook ตัวนี้จะทำงานหลังจากสร้างฟิลด์ order note เสร็จแล้ว เขียนโค้ดงี้


/**
 * Add the field to the checkout page
 */
add_action( 'woocommerce_after_order_notes', 'add_uid_field' );

function add_uid_field( $checkout ) {
	echo '<div id="add_uid_field"><h2>' . __( 'Extras' ) . '</h2>';
	woocommerce_form_field( 'uid', array(
		'type'        => 'text',
		'class'       => array( 'my-field-class form-row-wide' ),
		'label'       => __( 'uID' ),
		'placeholder' => __( 'google analytics uID' ),
		'required'    => true,
	), $checkout->get_value( 'uid' ) );
	echo '</div>';
}

โค้ดนี้จะเป็นการบอกว่า หลังจากที่สร้างฟิลด์ order notes เสร็จแล้วเนี่ยให้มารันฟังก์ชั่น add_uid_field ของเราด้วย

ในฟังก์ชั่น add_uid_field ให้พ่นคำว่า Extras ออกมา และพ่นเท็กฟิลด์ uid ออกมา การพ่นเท็กฟิลด์ uid จะใช้คำสั่ง woocommerce_form_field เข้ามาช่วย จริงๆแล้วเราจะเขียนโดยใช้แท็ก <input type=text /> ธรรมดาๆก็ได้

ตอนที่ผมทำงานจริงๆ ฟังก์ชั่น add_uid_field นั้นผมใช้ hidden field เพื่อไม่ให้ยูสเซอร์เห็น เพราะว่าฟิลด์นี้ค่ามันจะถูกป้อนด้วย javascript อัตโนมัติ แต่ในบทความนี้ผมใช้ text field เพื่อให้ท่านๆที่ผ่านมาอ่านมองเห็น ผลลัพธ์

ถัดจากนั้น เมื่อมีฟิลด์ที่ต้องการแล้ว เราก็เอาค่าจากในฟิลด์นั้นเก็บลงฐานข้อมูลตอน WooCommerce สร้างใบออเดอร์


/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'update_uid_order_meta' );

function update_uid_order_meta( $order_id ) {
	if ( ! empty( $_POST['uid'] ) ) {
		update_post_meta( $order_id, 'uid', sanitize_text_field( $_POST['uid'] ) );
	}
}

โค้ดด้านบนเป็นการบอกว่า ตอนที่ WooCommerce เอาข้อมูลลงไปเก็บในดาต้าเบส ให้รันฟังก์ชั่น update_uid_order_meta ของเราด้วย

ในฟังก์ชั่น update_uid_order_meta ก็จะบอกว่าถ้าหากมีข้อมูลในช่องป้อน uid ให้เอามันไปเก็บไว้ที่ตาราง wp_postmeta โดยตั้งชื่อว่า uid

จบ

เมื่อต้องการนำค่า uid มาใช้งานก็ให้ใช้ฟังก์ชั่น get_post_meta เข้ามาช่วยดึง

โค้ดทั้งหมดเป็นดังนี้


/**
 * Add the field to the checkout page
 */
add_action( 'woocommerce_after_order_notes', 'add_uid_field' );

function add_uid_field( $checkout ) {
	echo '<div id="add_uid_field"><h2>' . __( 'Extras' ) . '</h2>';
	woocommerce_form_field( 'uid', array(
		'type'        => 'text',
		'class'       => array( 'my-field-class form-row-wide' ),
		'label'       => __( 'uID' ),
		'placeholder' => __( 'google analytics uID' ),
		'required'    => true,
	), $checkout->get_value( 'uid' ) );
	echo '</div>';
}


/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'update_uid_order_meta' );

function update_uid_order_meta( $order_id ) {
	if ( ! empty( $_POST['uid'] ) ) {
		update_post_meta( $order_id, 'uid', sanitize_text_field( $_POST['uid'] ) );
	}
}

ความรู้เพิ่มเติม

คำสั่ง update_post_meta เป็นคำสั่งสำหรับนำข้อมูลไปเก็บไว้ในตาราง wp_postmeta
คำสั่ง get_post_meta เป็นคำสั่งสำหรับดึงข้อมูลออกจากตาราง wp_postmeta ออกมาใช้งาน
คำสั่ง add_post_meta เป็นคำสั่งสำหรับนำข้อมูลไปเก็บไว้ในตาราง wp_postmeta คล้ายกับ update_post_meta ต่างกันตรงที่คำสั่ง update_post_meta ก่อนเอาข้อมูลไปเก็บจะเช็กดูว่ามีข้อมูลเก่าหรือไม่ ถ้ามีก็จะไม่เพิ่มแต่ใช้วิธีอัปเดตแทน ส่วน add_post_meta นั้นเพิ่มทุกกรณี