Skip to content

Instantly share code, notes, and snippets.

@mikejolley
Created January 13, 2012 00:31
Show Gist options
  • Save mikejolley/1604009 to your computer and use it in GitHub Desktop.
Save mikejolley/1604009 to your computer and use it in GitHub Desktop.
WooCommerce - Add a special field to the checkout, order emails and user/order meta
/**
* Add the field to the checkout
**/
add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h3>'.__('My Field').'</h3>';
/**
* Output the field. This is for 1.4.
*
* To make it compatible with 1.3 use $checkout->checkout_form_field instead:
$checkout->checkout_form_field( 'my_field_name', array(
'type' => 'text',
'class' => array('my-field-class orm-row-wide'),
'label' => __('Fill in this field'),
'placeholder' => __('Enter a number'),
));
**/
woocommerce_form_field( 'my_field_name', array(
'type' => 'text',
'class' => array('my-field-class orm-row-wide'),
'label' => __('Fill in this field'),
'placeholder' => __('Enter a number'),
), $checkout->get_value( 'my_field_name' ));
echo '</div>';
/**
* Optional Javascript to limit the field to a country. This one shows for italy only.
**/
?>
<script type="text/javascript">
jQuery('select#billing_country').live('change', function(){
var country = jQuery('select#billing_country').val();
var check_countries = new Array(<?php echo '"IT"'; ?>);
if (country && jQuery.inArray( country, check_countries ) >= 0) {
jQuery('#my_custom_checkout_field').fadeIn();
} else {
jQuery('#my_custom_checkout_field').fadeOut();
jQuery('#my_custom_checkout_field input').val('');
}
});
</script>
<?php
}
/**
* Process the checkout
**/
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
global $woocommerce;
// Check if set, if its not set add an error. This one is only requite for companies
if ($_POST['billing_company'])
if (!$_POST['my_field_name'])
$woocommerce->add_error( __('Please enter your XXX.') );
}
/**
* Update the user meta with field value
**/
add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta');
function my_custom_checkout_field_update_user_meta( $user_id ) {
if ($user_id && $_POST['my_field_name']) update_user_meta( $user_id, 'my_field_name', esc_attr($_POST['my_field_name']) );
}
/**
* Update the order meta with field value
**/
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ($_POST['my_field_name']) update_post_meta( $order_id, 'My Field', esc_attr($_POST['my_field_name']));
}
/**
* Add the field to order emails
**/
add_filter('woocommerce_email_order_meta_keys', 'my_custom_checkout_field_order_meta_keys');
function my_custom_checkout_field_order_meta_keys( $keys ) {
$keys[] = 'My Field';
return $keys;
}
@esrointl
Copy link

How could I add that custom field value to order_comments? Fulfillment software won't pull in the order meta by default.

@zaheer-bashir
Copy link

zaheer-bashir commented Jul 22, 2020

You can also used to add Email order data by using this code

add_action( "woocommerce_email_after_order_table", "custom_woocommerce_email_after_order_table", 10, 1);

function custom_woocommerce_email_after_order_table( $order ) {

    echo '<p><strong>Mobile Phone :</strong>'. get_post_meta( $order->id, "mobile_phone", true ) .'</p>';
    echo '<p><strong>Birthday :</strong>'. get_post_meta( $order->id, "birthday", true ) .'</p>';


}

Screenshot_1

@mcnaveen
Copy link

mcnaveen commented Oct 18, 2020

How to show an error when the added field is empty?

Edit: Here is the Updated Code. (I disabled the Last Few Lines which helps to send the detail via Email)
https://gist.github.com/mcnaveen/917fc756f163596ca80e1b7e14233f9f

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment