สวัสดีครับผม วันนี้ก็กลับมาพบกันอีกเช่นเคยกับบล็อกเล่าเรื่องราวการทำเว็บไซต์นะครับ โดยวันนี้ผมจะมานำเสนอชุดคำสั่งหรือ code snippets สำหรับ Woocommerce ครับ โดยมีโจทย์ที่น่าสนใจคือ ถ้าเรามีสินค้าหลากหลายตัวเลือก และแต่ละตัวเลือกนั้น ก็ให้ชำระเงินได้แค่บางช่องทางเท่านั้น เช่น สั่งรองรุ่นปกติ ให้เก็บเงินปลายทาง สั่งรองเท้า Limited Edition ให้โอนเงิน
function add_variation_payment_gateway_field( $loop, $variation_data, $variation ) {
woocommerce_wp_select( array(
'id' => 'variation_payment_gateway[' . $loop . ']',
'label' => __( 'Payment Gateway', 'woocommerce' ),
'class' => 'variation_payment_gateway',
'value' => get_post_meta( $variation->ID, 'variation_payment_gateway', true ),
'options' => array(
'' => __( 'No specific gateway', 'woocommerce' ),
'bacs' => __( 'Direct Bank Transfer', 'woocommerce' ),
'cod' => __( 'Cash on Delivery', 'woocommerce' ),
// Add more payment gateway options here
),
) );
}
add_action( 'woocommerce_variation_options_pricing', 'add_variation_payment_gateway_field', 10, 3 );
function save_variation_payment_gateway_field( $variation_id, $i ) {
$payment_gateway = $_POST['variation_payment_gateway'][ $i ];
if ( ! empty( $payment_gateway ) ) {
update_post_meta( $variation_id, 'variation_payment_gateway', sanitize_text_field( $payment_gateway ) );
}
}
add_action( 'woocommerce_save_product_variation', 'save_variation_payment_gateway_field', 10, 2 );
function enable_payment_methods_based_on_variation($available_gateways) {
global $woocommerce;
$variation_payment_gateway = array();
if (isset($woocommerce->cart)) {
$items = $woocommerce->cart->get_cart();
foreach ($items as $item) {
if (isset($item['variation_id'])) {
$variation_id = $item['variation_id'];
$payment_gateway = get_post_meta($variation_id, 'variation_payment_gateway', true);
if (!empty($payment_gateway)) {
$variation_payment_gateway[] = $payment_gateway;
}
}
}
}
if (!empty($variation_payment_gateway)) {
foreach ($available_gateways as $gateway_id => $gateway) {
if (!in_array($gateway_id, $variation_payment_gateway)) {
unset($available_gateways[$gateway_id]);
}
}
}
return $available_gateways;
}
add_filter('woocommerce_available_payment_gateways', 'enable_payment_methods_based_on_variation');
และนี่คือคำสั่งที่ว่าครับ สำหรับ Woocommerce โดยในตัวอย่างผมทำเป็นแบบ option selection สำหรับตัวเลือกการจ่ายเงินสองแบบคือแบบ BACS (โอนเงินผ่านบัญชีธนาคาร) และแบบ COD (ชำระเงินปลายทาง) ถ้าหากเรามีช่องทางมากกว่านี้ก็ใส่ payment id ของช่องทางการชำระเงินเข้าไปได้ครับ
และชุดคำสั่งนี้เมื่อไปยังหน้า Checkout ระบบจะเช็คจากสินค้าในตะกร้าว่ามีสินค้าไหนระบุช่องทางการชำระเงินไว้หรือไม่ ถ้ามีจะให้อิงตัวนั้น แต่ถ้าไม่มีก็จะแสดงตัวเลือกทั้งหมดครับ
ลองนำไปต่อยอดกันดูได้ครับ โดยชุดคำสั่งนี้เขียนไว้ในไฟล์ fucntions.php ของธีมที่เราใช้งานอยู่นะครับ