I'm trying to re-order 2 custom checkout fields added with the help of woocommerce_checkout_init
filter, just that when I apply woocommerce_checkout_fields
filter to re-order fields, it doesn't recognize them and they are null
.
I think it's because the filter woocommerce_checkout_init
goes after woocommerce_checkout_fields
.
How Can I solve this?
Here is my code:
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_email_checkout', 10, 2 );
function wc_add_confirm_email_checkout( $checkout ) {
$checkout->checkout_fields['billing']['billing_email2'] = array(
'type' => 'text',
'label' => __( 'Confirm Email Address', 'woocommerce' ),
'required' => true,
'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' )
);
}
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_password_checkout', 10, 2 );
function wc_add_confirm_password_checkout( $checkout ) {
//var_dump($checkout->checkout_fields);
if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) {
$checkout->checkout_fields['account']['account_password2'] = array(
'type' => 'password',
'label' => __( 'Confirm password', 'woocommerce' ),
'required' => true,
'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' )
);
}
}
add_filter('woocommerce_checkout_fields','reorder_woo_fields');
function reorder_woo_fields($fields) {
$fields2['billing']['billing_first_name'] = $fields['billing']['billing_first_name'];
$fields2['billing']['billing_last_name'] = $fields['billing']['billing_last_name'];
$fields2['billing']['billingooglg_email'] = $fields['billing']['billing_email'];
$fields2['billing']['billing_email2'] = $fields['billing']['billing_email2'];
$fields2['billing']['account_password'] = $fields['account']['account_password'];
$fields2['billing']['account_password2'] = $fields['account']['account_password2'];
$fields2['billing']['billing_address_1'] = $fields['billing']['billing_address_1'];
$fields2['billing']['billing_postcode'] = $fields['billing']['billing_postcode'];
var_dump($fields2);
//return $fields2;
}
For WooCommerce 3+ (update):
Here is fully functional example for WooCommerce 3+:
Code goes in function.php file of your active child theme (or theme) or also in any plugin file.
Before WooCommerce 3
I am not completely sure, but you there are some things that you can't do like merging billing fields with account fields. If you want to do that is going to be much more complicated than what you are trying to do here. In that case you will need to rewrite/create some checkout templates…
Another thing is that
billing_email
andbilling_phone
are sharing the same line together with'class' => 'form-row-first'
and'class' => 'form-row-last'
. When not this class is define'class' => 'form-row-wide'
… So you are going to need overriding these'class'
too.After that you dont need to use
'woocommerce_checkout_init'
hook…You can still use
'woocommerce_checkout_fields'
.Also you can merge all of them in one function this way:
Code goes in function.php file of your active child theme (or theme) or also in any plugin file.
As I have said before, I think that you can't merge billing fields with account fields.
As
'account_password2'
already exist if you refer to official documentation (see below in first reference link), you may not need to create it. You will have to test this and to fine tune it. But this is the way to do it.References:
Notice!
Woocommerce has made some changes and for arranging address fields you should use 'woocommerce_default_address_fields' filter.
Reorder Woocommerce checkout fields