I need to show an text input field when customers select BACS gateway and I would like the input field value to be appended to orders and email notifications
There is a lot of missing steps as the answer code you are using is just displaying a field in checkout under BACS payment description:
You need to (only when BACS is the selected payment method):
So as you can see what you are asking is huge (too broad) and will require an additional new question for point 3, 4 and 5, where you will need to say where you want to output it (the location).
All the code for steps 1 and 2:
add_filter( 'woocommerce_gateway_description', 'gateway_bacs_appended_custom_text_fields', 10, 2 );
function gateway_bacs_appended_custom_text_fields( $description, $payment_id ){
if( $payment_id === 'bacs' ){
ob_start(); // Start buffering
echo '<div class="bacs-fields" style="padding:10px 0;">';
woocommerce_form_field( 'udfyld_ean', array(
'type' => 'text',
'label' => __("Udfyld EAN", "woocommerce"),
'class' => array('form-row-wide'),
'required' => true,
), '');
echo '<div>';
$description .= ob_get_clean(); // Append buffered content
}
return $description;
}
// Process the field (validation)
add_action('woocommerce_checkout_process', 'udfyld_ean_checkout_field_validation');
function udfyld_ean_checkout_field_validation() {
if ( $_POST['payment_method'] === 'bacs' && isset($_POST['udfyld_ean']) && empty($_POST['udfyld_ean']) )
wc_add_notice( __( 'Please enter your "Udfyld EAN" number.' ), 'error' );
}
// Save "Udfyld EAN" number to the order as custom meta data
add_action('woocommerce_checkout_create_order', 'save_udfyld_ean_to_order_meta_data', 10, 4 );
function save_udfyld_ean_to_order_meta_data( $order, $data ) {
if( $data['payment_method'] === 'bacs' && isset( $_POST['udfyld_ean'] ) ) {
$order->update_meta_data( '_udfyld_ean', sanitize_text_field( $_POST['udfyld_ean'] ) );
}
}
Code goes in function.php file of your active child theme (or active theme). tested and works.
To get this custom field value from
$order
theWC_Order
object you will use:$udfyld_ean = $order->get_meta('_udfyld_ean');
Or from
$order_id
the order ID you can use WordPressget_post_meta()
function:$udfyld_ean = get_post_meta( $order_id, '_udfyld_ean', true );
The field validation (for BACS as the selected payment method):
The inputted field value is saved to the order meta data (phpMyAdmin view in wp_postmeta
table):