Reorder Checkout Fields in WooCommerce
If you didn’t read my complete tutorial about WooCommerce checkout fields, I highly recommend to read it first, then come back here.
Sorting Fields within a Group
First thing you have to keep in mind, that fields are separated into groups, and actually there are 4 groups:
billing
– Billing Addressshipping
– Shipping Addressaccount
– Account Loginorder
– Additional information
Each of these groups contains fields, I think you know which ones. And you can super easily reorder them with a special priority
parameter.
Example – I would like to make the email field the first one to display, I can do it with these couple lines of code:
add_filter( 'woocommerce_checkout_fields', 'misha_email_first' );
function misha_email_first( $checkout_fields ) {
$checkout_fields['billing']['billing_email']['priority'] = 4;
return $checkout_fields;
}
The result:

Why I set priority
to 4
? Let me explain, each of default fields has its own priority, all of them are listed in the table below. So, according to the table, to make the email field first I have to use a value less than 10.
Group | Name | Priority |
---|---|---|
billing | billing_first_name | 10 |
billing_last_name | 20 | |
billing_company | 30 | |
billing_country | 40 | |
billing_address_1 | 50 | |
billing_address_2 | 60 | |
billing_city | 70 | |
billing_state | 80 | |
billing_postcode | 90 | |
billing_phone | 100 | |
billing_email | 110 | |
shipping | shipping_first_name | 10 |
shipping_last_name | 20 | |
shipping_company | 30 | |
shipping_country | 40 | |
shipping_address_1 | 50 | |
shipping_address_2 | 60 | |
shipping_city | 70 | |
shipping_state | 80 | |
shipping_postcode | 90 | |
account | account_password | – |
order | order_comments | – |
If you changed the fields order and your result looks weird (for example if you tried to place a fullwidth field between halfwidth fields, e.g. billing email between first and last names), you can fix it easily with this tip.
woocommerce_default_address_fields
There is also a hook – woocommerce_default_address_fields
which allows to change the order for both billing and shipping fields at the same time. So, for our example, the code will look like this:
add_filter( 'woocommerce_default_address_fields', 'misha_email_first' );
function misha_email_first( $address_fields ) {
// as you can see, no needs to specify a field group anymore
$address_fields['email']['priority'] = 4;
return $address_fields;
}
Moving a Field to Another Field Group
For me this way of sorting seems a little tricky ✨ and won’t work in 100% situations, for example you can not move the billing country field under Order Notes. Well, actually you can, but (a huge "but"), when you try to change a country to the United States for example, the States won’t appear in the nearest field.
Here is the example, we move the billing email field into another group:
add_filter( 'woocommerce_checkout_fields', 'misha_billing_email_another_group' );
function misha_billing_email_another_group( $checkout_fields ){
// 1. We assign a field array to another group here
$checkout_fields['order']['billing_email'] = $checkout_fields['billing']['billing_email'];
// 2. Remove a field from a previous location
unset( $checkout_fields['billing']['billing_email'] );
return $checkout_fields;
}
And it works pretty good.


Misha Rudrastyh
Hey guys and welcome to my website. For more than 10 years I've been doing my best to share with you some superb WordPress guides and tips for free.
Need some developer help? Contact me
Great post and very helpful! Just a quick note: The code for woocommerce_default_address_fields needs to return $address_fields instead of $checkout_fields.
Thank you! 🙃 Updated
Hi
thank you very much
first solution worked for me
best regards
Thanks a lot!
Very useful and practical
nice and simple thanks