Customizing my-account addresses fields in Woocomm

2019-01-15 12:13发布

问题:

I would like to remove the form field billing_adress_2 within the template form-edit-addresses.php.

To finish is it possible to reorder the form fields likes this:


first_name - last_name

email - phone

company

address_1

postcode

city

state


This change I would like to apply it only on the page (templates) form-edit-addresses.php

Any help is appreciated

回答1:

In My account > Adresses section, the below hooked functions will:

  • remove "Address 2" billing and shipping fields
  • reorder billing and shipping address fields
  • reorder billing Email and phone fields (after first and last names)
  • remove "Address 2" from display

You forgot the "country" field that you can reorder easily in the $sorted_fields array…

The code:

// Account Edit Adresses: Remove and reorder addresses fields
add_filter(  'woocommerce_default_address_fields', 'custom_default_address_fields', 20, 1 );
function custom_default_address_fields( $fields ) {
    // Only on account pages
    if( ! is_account_page() ) return $fields;

    ## ---- 1.  Remove 'address_2' field ---- ##

    unset($fields['address_2']);

    ## ---- 2.  Sort Address fields ---- ##

    // Set the order (sorting fields) in the array below
    $sorted_fields = array('first_name','last_name','company','address_1','country','postcode','city','state');

    $new_fields = array();
    $priority = 0;

    // Reordering billing and shipping fields
    foreach($sorted_fields as $key_field){
        $priority += 10;

        if( $key_field == 'company' )
            $priority += 20; // keep space for email and phone fields

        $new_fields[$key_field] = $fields[$key_field];
        $new_fields[$key_field]['priority'] = $priority;
    }
    return $new_fields;
}

// Account Edit Adresses: Reorder billing email and phone fields
add_filter(  'woocommerce_billing_fields', 'custom_billing_fields', 20, 1 );
function custom_billing_fields( $fields ) {
    // Only on account pages
    if( ! is_account_page() ) return $fields;

    ## ---- 2.  Sort billing email and phone fields ---- ##

    $fields['billing_email']['priority'] = 30;
    $fields['billing_email']['class'] = array('form-row-first');
    $fields['billing_phone']['priority'] = 40;
    $fields['billing_phone']['class'] = array('form-row-last');

    return $fields;
}

// Account Displayed Addresses : Remove 'address_2'
add_filter( 'woocommerce_my_account_my_address_formatted_address' , 'my_account_address_formatted_addresses', 20, 3 );
function my_account_address_formatted_addresses( $address, $customer_id, $address_type ) {
    unset($address['address_2']); // remove Address 2

    return $address;
}

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

If you want to make that effective in checkout page too, you will have to remove this lines:

// Only on account pages
if( ! is_account_page() ) return $fields;

In each function (2 times)



回答2:

This code will change the order of the fields in the billing address as you want them to appear. Place this code in your themes functions.php file.

add_filter('woocommerce_address_to_edit', 'reorder_woocommerce_address_fields', 10, 2);

function reorder_woocommerce_address_fields( $address, $load_address) {
    $new_address['billing_first_name'] = $address['billing_first_name'];
    $new_address['billing_last_name'] = $address['billing_last_name'];
    $new_address['billing_email'] = $address['billing_email'];
    $new_address['billing_phone'] = $address['billing_phone'];

    $new_address['billing_email'] = array(
        'label'     => __('Email', 'woocommerce'),
        'required'  => true,
        'class'     => array('form-row-first'),
    );

    $new_address['billing_phone'] = array(
        'label'     => __('Phone', 'woocommerce'),
        'required'  => true,
        'class'     => array('form-row-last'),
        'clear'     => true
    );

    $new_address['billing_company'] = $address['billing_company'];
    $new_address['billing_address_1'] = $address['billing_address_1'];
    $new_address['billing_postcode'] = $address['billing_postcode'];
    $new_address['billing_city'] = $address['billing_city'];
    $new_address['billing_state'] = $address['billing_state'];

    return $new_address;
}