В качестве примера , добавляем поле для выбора картинки , в которой может быть более одной , и поля для ввода данных , и методы ,  шорт коды для их вывода .

Снимок2

// большой логотип  сайта (банер в шапке )
add_theme_support('custom-header', array(
    'default-text-color' => '000',
    'default-image' => '',
    'height' => 220,
    'width' => 1374,
    'max-width' => 1374,
    'random-default' => true,
    'wp-head-callback' => 'birdsite_header_style',
));

add_action('customize_register', function($customizer) {
    $customizer->add_section(
            'section_one', array(
        'title' => 'Настройки сайта',
        'description' => '',
        'priority' => 11,
            )
    );
    $customizer->add_setting('phone', array('default' => '89215555555'));

    $customizer->add_control('phone', array(
        'label' => 'Телефон',
        'section' => 'section_one',
        'type' => 'text',
            )
    );
    
    $customizer->add_setting('Email', array('default' => ''));
    $customizer->add_control('Email', array(
        'label' => 'Email',
        'section' => 'section_one',
        'type' => 'text',
            )
    );
    
    $customizer->add_setting('address', array('default' => ''));
    $customizer->add_control('address', array(
        'label' => 'Адрес',
        'section' => 'section_one',
        'type' => 'textarea',
            )
    );
    
    $customizer->add_setting('metrics', array('default' => ''));
    $customizer->add_control('metrics', array(
        'label' => 'Метрики',
        'section' => 'section_one',
        'type' => 'textarea',
            )
    );
    
    $customizer->add_setting('Ymap', array('default' => ''));
    $customizer->add_control('Ymap', array(
        'label' => 'Яндекс карта',
        'section' => 'section_one',
        'type' => 'textarea',
            )
    );

    $customizer->add_setting('logo2');
    $customizer->add_control(new WP_Customize_Image_Control($customizer, 'logo2', array(
        'label' => 'Логотип',
        'section' => 'section_one',
        'settings' => 'logo2',
    )));
});

add_shortcode("address", function(){
    return get_theme_mod('address', '');
});

add_shortcode("email", function(){
    return get_theme_mod('Email', '');
});

add_shortcode("phone", function(){
    return get_theme_mod('phone', '');
});

add_shortcode("ymap", function(){
    return get_theme_mod('Ymap', '');
});

add_shortcode("phoneLink", function(){
     $phone = get_theme_mod('phone', '');
     $cleanPhone = str_replace(array("(", ")", " ", "-"), "", $phone);
    return  "<span class=\"tel\">Тел:<a href=\"tel:$cleanPhone\">$phone</a></span>";
});

add_shortcode("emailLink", function(){
    $mail = get_theme_mod('Email', '');
    
    return "<span class=\"email\">E-mail:<a href=\"mailto:$mail\">$mail</a></span>";
});





add_action('wp_footer',  function(){
    echo get_theme_mod('metrics', '');
},11);

Добавить произвольное поле

Расширяем класс (пока не пойму как  добавить еще пару полей  ), естественно  2-е поле custom не сохраняется .

class Example_Customize_Textarea_Control extends WP_Customize_Control {
    public $type = 'phones';
 
    public function render_content() {
        ?>
        <label>
        <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
        <textarea rows="5" style="width:100%;" 
            <?php $this->link(); ?>><?php echo  $this->value() ; ?>
        </textarea>
        
        <input type="text" style="width:100%;" <?php $this->link('custom'); ?> value="<?=$this->value('custom') ; ?>"/>
        </label>
        <?php
    }
}

Добавляем как и прочие настройки

$customizer->add_setting( 'phones_setting', array(
           'default'=> 'Some default text for the textarea',
           'custom'=> 'custom',));

   $customizer->add_control( new Example_Customize_Textarea_Control( $customizer, 'phones_setting', array(
   'label'   => 'Textarea Setting',
   'section' => 'section_contacts',
   'settings'   => 'phones_setting',
   ) ) );

Пока решал эту  проблему  нашел еще вариант динамического построения настроек

//Динамически генерим поля по значениям из этого поля 

    $customizer->add_setting('phones-name', array('default' => 'Основной'));
    $customizer->add_control('phones-name', array(
        'label' => "Перечислите названия телефонов через %",
        'section' => 'section_contacts',
        'type' => 'textarea',
    ));

    $phones2 = explode("%", get_theme_mod("phones-name", ""));
    if (!empty($phones2)) {
        foreach ($phones2 as $key => $value) {
            $customizer->add_setting('phonealt-' . $key, array('default' => '89215555555'));
            $customizer->add_control('phonealt-' . $key, array(
                'label' => $value,
                'section' => 'section_contacts',
                'type' => 'text',
                    )
            );
        }
    }

i21^cimgpsh_orig

Вот регистрируем шорткод на вывод :

add_shortcode("phoneLink2", function($atts, $content = null) {
    extract(shortcode_atts(array(
        'with_name' => "",
                    ), $atts));

    $result = '';
    $namesofphones = explode("%", get_theme_mod("phones-names", ""));
    if (!empty($namesofphones)) {
        foreach ($namesofphones as $key => $value) {
            $phone = get_theme_mod("phonealt-" . $key, "");
            $cleanPhone = str_replace(array("(", ")", " ", "-"), "", $phone);
            $name="";
            if($with_name){
                $result.='<i class="fa fa-phone faa-ring animated primary-color"></i>';
                $name = "<span class='phoneName'>{$value}</span>";
            }
            $result.="<span class=\"tel\"><a href=\"tel:{$cleanPhone}\">{$phone}</a></span>" . $name;
        }
    }
    return $result;
});

PHP