Search code examples
wordpresspluginswoocommercehook-woocommerceaccount

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

  • 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.