Code สำหรับทำให้ Woocommerce รองรับช่องทางชำระเงินช่องทางเท่านั้น สำหรับสินค้า Variable

สวัสดีครับผม วันนี้ก็กลับมาพบกันอีกเช่นเคยกับบล็อกเล่าเรื่องราวการทำเว็บไซต์นะครับ โดยวันนี้ผมจะมานำเสนอชุดคำสั่งหรือ 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 ของธีมที่เราใช้งานอยู่นะครับ

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
Manage Consent Preferences
  • คุกกี้ที่จำเป็น
    Always Active

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้

  • คุกกี้เพื่อการวิเคราะห์

    คุกกี้ประเภทนี้จะทำการเก็บข้อมูลการใช้งานเว็บไซต์ของคุณ เพื่อเป็นประโยชน์ในการวัดผล ปรับปรุง และพัฒนาประสบการณ์ที่ดีในการใช้งานเว็บไซต์ ถ้าหากท่านไม่ยินยอมให้เราใช้คุกกี้นี้ เราจะไม่สามารถวัดผล ปรับปรุงและพัฒนาเว็บไซต์ได้

  • คุกกี้เพื่อปรับเนื้อหาให้เข้ากับกลุ่มเป้าหมาย

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

บันทึก