'Rearrange (sort by priority) Woocommerce my account fields

How can I rearrange my-account fields .I want to locate billing_address_1 field after billing_state and billing_city fields.

I used woocommerce_form_field_args hook and then used switch to find every single arg .

function bcod_wc_form_field_args( $args, $key, $value ){
switch ($key) {
        case 'billing_country':
            $args['class'] = array('hidden');
            break;
        case 'billing_address_1' :
            $args['priority'] = '85';// push down this field to bottom of state and city 
            $args['label'] = $args['label'] . ' Priority : ' . $args['priority'];
            $args['placeholder'] = 'خیابان اصلی ، خیابان فرعی ، کوچه ، پلاک';
            break;
        case 'billing_state' :
            $args['priority'] = '50';
            $args['label'] = $args['label'] . ' Priority : ' . $args['priority'];
            $args['class'] = array('form-row-first');
            break;
        case 'billing_city' :
            $args['priority'] = '55';
            $args['label'] = $args['label'] . ' Priority : ' . $args['priority'];
            $args['class'] = array('form-row-last');
            break;
        case 'billing_postcode' :
            $args['label'] = $args['label'] . ' Priority : ' . $args['priority'];
            $args['priority'] = '190';
            $args['class'] = array('form-row-first');
            break;
        case 'billing_email' :
            $args['label'] = $args['label'] . ' Priority : ' . $args['priority'];
            $args['priority'] = '80';
            $args['class'] = array('form-row-last');
            break;
        default:
            return $args;
            break;
        }
    return $args;
}

I expect the billing_address_1 field located after state and city But this code does not affect the sort of fields . priorities are changed but the fields are at the default places . this image is my result : the-result-of-my-code
(source: imgurl.ir)



Solution 1:[1]

To rearrange the "My account" Adresses billing fields, you'll need to use something like:

// Change billing fields location
add_filter( 'woocommerce_billing_fields', 'arrange_billing_fields', 10, 1 );
function arrange_billing_fields( $fields ){
    // Only on my account
    if( is_account_page() ) :

    $fields['billing_country']['class']         = array('hidden');

    $fields['billing_state']['priority']        = '50';
    $fields['billing_state']['label']          .= ' (Priority : '.$fields['billing_state']['priority'].')';
    $fields['billing_state']['class']           = array('form-row-first');

    $fields['billing_city']['priority']         = '55';
    $fields['billing_city']['label']           .= ' (Priority : '.$fields['billing_city']['priority'].')';
    $fields['billing_city']['class']            = array('form-row-last');

    $fields['billing_email']['priority']        = '80';
    $fields['billing_email']['label']          .= ' (Priority : '.$fields['billing_email']['priority'].')';
    $fields['billing_email']['class']           = array('form-row-last');

    $fields['billing_address_1']['priority']    = '85';
    $fields['billing_address_1']['label']      .= ' (Priority : '.$fields['billing_address_1']['priority'].')';
    $fields['billing_address_1']['placeholder'] = '?????? ???? ? ?????? ???? ? ???? ? ????';

    $fields['billing_postcode']['priority']     = '190';
    $fields['billing_postcode']['label']       .= ' (Priority : '.$fields['billing_postcode']['priority'].')';
    $fields['billing_postcode']['class']        = array('form-row-first');

    endif;

    return $fields;
}

// For the state field priority location for some countries
add_filter( 'woocommerce_get_country_locale', 'custom_country_locale', 10, 1 );
function custom_country_locale( $countries_locale ){
    // Only on my account
    if( is_account_page() ):

    // Loop Through country locale array
    foreach( $countries_locale as $country_code => $fields ){
        // Loop through defined fields (targeting the state field)
        foreach( $fields as $field_key => $data ) {
            if( $field_key == 'state' && isset($data['priority']) ){
                $countries_locale[$country_code][$field_key]['priority'] = '50';
            }
        }
    }

    endif;

    return $countries_locale;
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 LoicTheAztec