Add a custom field to Woocommerce general setting in store address section

Viewed 2952

I'm looking to add a Phone number field to the Woocommerce settings page. I can get the field to add to the settings list, but it gets appended to the bottom of the entire tab. Ideally I'd like to add the field in the Store Address sections on the general tab.

Here's what I'm using now (trimmed down):

add_filter('woocommerce_general_settings', 'woocommerce_add_phone');

function woocommerce_add_phone($settings) {

    $settings[] = array(
        'title'    => 'Phone Number',
        'type'     => 'text',
    );

    $sections[] = array( 'type' => 'sectionend', 'id' => 'store_address' );

    return $settings;

}

I made an attempt at using array_splice but couldn't get anywhere with it.

Any advice would be greatly appreciated.

3 Answers

This can be done in a simple way targeting the woocommerce_store_postcode field ID to insert the Store phone custom field in this general settings at the right location:

add_filter('woocommerce_general_settings', 'general_settings_shop_phone');
function general_settings_shop_phone($settings) {
    $key = 0;

    foreach( $settings as $values ){
        $new_settings[$key] = $values;
        $key++;

        // Inserting array just after the post code in "Store Address" section
        if($values['id'] == 'woocommerce_store_postcode'){
            $new_settings[$key] = array(
                'title'    => __('Phone Number'),
                'desc'     => __('Optional phone number of your business office'),
                'id'       => 'woocommerce_store_phone', // <= The field ID (important)
                'default'  => '',
                'type'     => 'text',
                'desc_tip' => true, // or false
            );
            $key++;
        }
    }
    return $new_settings;
}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

Tested and work… You will get something like:

enter image description here

LoicTheAztec code works fine but I wanted to find a solution without looping. Here is my version:

function add_phone_number_settings($settings) {
    // Search array for the id you want
    $key              = array_search('woocommerce_store_postcode', array_column($settings, 'id')) + 1;
    $custom_setting[] = array(
        'title'    => __('Phone Number'),
        'desc'     => __("Enter shop phone number"),
        'id'       => 'woocommerce_store_phone_number',
        'default'  => '',
        'type'     => 'text',
        'desc_tip' => true,
    );

    // Merge with existing settings at the specified index
    $new_settings = array_merge(array_slice($settings, 0, $key), $custom_setting, array_slice($settings, $key));
    return $new_settings;
}
add_filter('woocommerce_general_settings', 'add_phone_number_settings');

This code will add your phone number after the post code element in the Store Address section. I borrowed the splice function from here.

add_filter('woocommerce_general_settings', 'woocommerce_general_settings_add_phone_number');

function woocommerce_general_settings_add_phone_number($settings) {

    $phone_number = array(
        'title'    => __( 'Phone Number', 'woocommerce' ),
        'desc'     => __( 'Add your phone number.', 'woocommerce' ),
        'id'       => 'woocommerce_store_phone_number',
        'default'  => '',
        'type'     => 'text',
        'desc_tip' => false,
    );

    $array_pos = 0;

    foreach ($settings as $key => $value) {
       if ( $value['id'] == 'woocommerce_store_postcode' ) {
            $array_pos = $key;
            break;
       }
    }

    $settings = array_insert( $settings, $phone_number, $array_pos + 1 );

    return $settings;
}

/*
    Array insert
    @array      the array to add an element to
    @element    the element to add to the array
    @position   the position in the array to add the element
 */
if(!function_exists('array_insert')) {
    function array_insert($array, $element, $position) {
        // if the array is empty just add the element to it
        if(empty($array)) {
            $array[] = $element;
        // if the position is a negative number
        } elseif(is_numeric($position) && $position < 0) {
            // if negative position after count
            if(count($array) + $position < 0) {
                $position = 0;
            } else {
                $position = count($array) + $position;
            }
            // try again with a positive position
            $array = array_insert($array, $element, $position);
        // if array position already set
        } elseif(isset($array[$position])) {
            // split array into two parts
            $split1 = array_slice($array, 0, $position, true);
            $split2 = array_slice($array, $position, null, true);
            // add new array element at between two parts
            $array = array_merge($split1, array($position => $element), $split2);
        // if position not set add to end of array
        } elseif(is_null($position)) {
            $array[] = $element;
        // if the position is not set
        } elseif(!isset($array[$position])) {
            $array[$position] = $element;
        }
        // clean up indexes
        $array = array_values($array);
        return $array;
    }
}
Related