Simpan nilai kolom kustom checkout dan tampilkan di perintah admin WooCommerce

Jan 07 2021

Saya memiliki beberapa bidang tambahan di checkout saya untuk mengajukan pertanyaan dari pelanggan tentang hal-hal tertentu terkait pesanan mereka. Sebagian besar adalah kolom input teks tetapi ada satu menu Select yang menanyakan bagaimana mereka mendengar tentang situs klien saya. Saya tidak dapat menemukan cara menampilkan nilai di area meta pesanan untuk opsi yang dipilih. Inilah cara saya membuat drop down pilihan itu di file functions.php saya dari tema saya.

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' ) );

Sekarang saya menambahkan fungsi untuk memperbarui nilai meta pesanan:

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'] ) );
    }
}

Dan terakhir tampilkan nilai pada halaman pesanan:

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>';
}

Terakhir, berikut ini bagaimana kode menu pilih muncul saat checkout:

<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>

Sekarang, ini berfungsi dengan baik untuk bidang input teks tetapi tidak memilih menu. Bagaimana cara mengubah ini agar berfungsi sehingga saya dapat menampilkan data yang dihasilkan?

Jawaban

1 LoicTheAztec Jan 07 2021 at 15:07

Ada beberapa kesalahan dalam beberapa fungsi Anda… Anda perlu menggunakan tombol bidang checkout yang sama sebagai kunci meta dalam fungsi berikut:

Di fungsi ke-2, Anda menggunakan hook lain dan menyimpan bidang khusus sebagai data meta pengguna juga:

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 );
        }
    }
}

Dalam fungsi ke-3 gunakan ini:

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>';
    }
}

Ini harus bekerja lebih baik sekarang.


Catatan:

Mengapa menyimpan bidang checkout ini juga sebagai data meta pengguna khusus?

Karena dalam fungsi pertama Anda, Anda memiliki $checkout->get_value( 'aba_hear' )yang akan menampilkan nilai yang dipilih pada dari pesanan terakhir pelanggan di bidang checkout kustom ini. Nilai dibaca dari meta pengguna 'aba_hear'.