บันทึกค่าฟิลด์ที่กำหนดเองในการชำระเงินและแสดงในคำสั่งของผู้ดูแลระบบ WooCommerce

Jan 07 2021

ฉันมีช่องเพิ่มเติมในการชำระเงินของฉันสำหรับการถามคำถามจากลูกค้าเกี่ยวกับบางสิ่งเกี่ยวกับคำสั่งซื้อของพวกเขา ส่วนใหญ่เป็นช่องป้อนข้อความ แต่มีเมนู Select หนึ่งรายการเพื่อถามว่าพวกเขาได้ยินเกี่ยวกับไซต์ลูกค้าของฉันได้อย่างไร ฉันไม่สามารถหาวิธีแสดงค่าในพื้นที่เมตาของลำดับสำหรับตัวเลือกที่เลือกได้ นี่คือวิธีที่ฉันสร้างรายการแบบเลื่อนลงที่เลือกในไฟล์ functions.php จากธีมของฉัน

woocommerce_form_field( 'aba_hear', array(
    'type'     => 'select',
    'required' => 'true',
    'class'    => array('hear-class form-row-wide'),
    'label'    => __('How did You Hear About Us?'),
    'options'  => array( // options for <select> or <input type="radio" />
        ''          => 'Please select', // empty values means that field is not selected
        'Instagram' => 'Instagram',
        'Facebook'  => 'Facebook',
        'Yelp'  => 'Yelp',
        'Other' => 'Other',
    )

), $checkout->get_value( 'aba_hear' ) );

ตอนนี้ฉันไปเพิ่มฟังก์ชั่นเพื่ออัปเดตค่าเมตาคำสั่ง:

add_action( 'woocommerce_checkout_update_order_meta', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['aba_hear'] ) ) { update_post_meta( $order_id, 'How did You Hear About Us&#63;', sanitize_text_field( $_POST['aba_hear'] ) );
    }
}

และสุดท้ายแสดงค่าในหน้าคำสั่งซื้อ:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . get_post_meta( $order->id, 'Is this a Gift&#63;', true ) . '</p>';
}

สุดท้ายนี้คือลักษณะที่รหัสของเมนูที่เลือกจะปรากฏในขั้นตอนการชำระเงิน:

<p class="form-row hear-class form-row-wide validate-required" id="aba_hear_field" data-priority="">
    <label for="aba_hear" class="">How did You Hear About Us&#063;&nbsp;<abbr class="required" title="required">*</abbr></label>
    <span class="woocommerce-input-wrapper">
        <select name="aba_hear" id="aba_hear" class="select " data-allow_clear="true" data-placeholder="Please select">
            <option value=""  selected='selected'>Please select</option>
            <option value="Instagram" >Instagram</option>
            <option value="Facebook" >Facebook</option>
            <option value="Yelp" >Yelp</option>
            <option value="Other" >Other</option>
        </select>
    </span>
</p>

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

คำตอบ

1 LoicTheAztec Jan 07 2021 at 15:07

มีข้อผิดพลาดบางอย่างในบางฟังก์ชันของคุณ ... คุณต้องใช้คีย์ฟิลด์การชำระเงินเดียวกันกับเมตาคีย์ในฟังก์ชันต่อไปนี้:

ในฟังก์ชั่นที่ 2 คุณใช้ hook อื่นและบันทึกฟิลด์ที่กำหนดเองเป็นข้อมูลเมตาของผู้ใช้ด้วย:

add_action( 'woocommerce_checkout_create_order', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order ) { if ( isset($_POST['aba_hear']) && ! empty($_POST['aba_hear']) ) { $order->update_meta_data( '_aba_hear', sanitize_text_field( $_POST['aba_hear'] ) ); // Update user data if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(), 'aba_hear', true );
        }
    }
}

ในฟังก์ชั่นที่ 3 ให้ใช้สิ่งนี้:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta( $order ){
    $value = $order->get_meta( '_aba_hear' );

    if ( ! empty($value) ) { echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . $value . '</p>';
    }
}

ตอนนี้ควรจะทำงานได้ดีขึ้นแล้ว


หมายเหตุ:

เหตุใดจึงบันทึกช่องชำระเงินนี้เป็นข้อมูลเมตาของผู้ใช้ที่กำหนดเองด้วย

เนื่องจากในฟังก์ชันแรกของคุณคุณมี$checkout->get_value( 'aba_hear' )สิ่งนั้นจะแสดงค่าที่เลือกจากลำดับสุดท้ายของลูกค้าในฟิลด์การชำระเงินที่กำหนดเองนี้ ค่านี้อ่านได้จากเมตาของผู้ใช้ 'aba_hear'