Добавление нескольких произвольных полей на страницу общих настроек

9 янв. 2014 г., 23:18:46
Просмотры: 59.1K
Голосов: 32

Я хочу добавить несколько произвольных полей в общие настройки. Вот код, который я использую. Он работает нормально, но я не могу понять, как добавить больше полей.

Я хочу создать два поля: одно для номера телефона и второе для адреса:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('Мое поле' , 'my_first_field' ).'</label>' , 'print_custom_field', 'general');
}

function print_custom_field()
{
    $value = get_option( 'my_first_field', '' );
    echo '<input type="text" id="my_first_field" name="my_first_field" value="' . $value . '" />';
}

add_filter('admin_init', 'register_fields');

Единственный способ, которым мне удалось заставить это работать для нескольких полей - это дублировать весь код.

Тогда это выглядит так:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('Мое поле' , 'my_first_field' ).'</label>' , 'print_first_field', 'general');

    register_setting('general', 'my_second_field', 'esc_attr');
    add_settings_field('my_second_field', '<label for="my_second_field">'.__('Мое поле' , 'my_second_field' ).'</label>' , 'print_second_field', 'general');
}

function print_first_field()
{
    $value = get_option( 'my_first_field', '' );
    echo '<input type="text" id="my_first_field" name="my_first_field" value="' . $value . '" />';
}

function print_second_field()
{
    $value = get_option( 'my_second_field', '' );
    echo '<input type="text" id="my_second_field" name="my_second_field" value="' . $value . '" />';
}

add_filter('admin_init', 'register_fields');

Но это, вероятно, не лучший способ сделать это. Я пытался создать settings_section, но это просто не работало или не сохранялось и т.д. Это очень запутанно.

0
Все ответы на вопрос 2
9
46

Второй фрагмент кода технически является правильным способом реализации. Однако, в конце функции add_settings_field() можно передавать аргументы.

Пожалуйста, ознакомьтесь с документацией функции WordPress Add_Settings_Field. Это поможет вам лучше понять, как на самом деле работает функция add_settings_field().

Теперь, учитывая это, вы можете использовать 'общую' функцию для вашего callback-обработчика. Как я делаю на странице настроек при разработке тем.

Вот пример, как я это реализую:

// Мои примеры полей
add_settings_field(  
    'tutorial_display_count',                      
    'Количество отображаемых уроков',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'tutorial_display_count' // $args для callback
    ) 
);
add_settings_field(  
    'blog_display_count',                      
    'Количество отображаемых записей блога',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'blog_display_count'  // $args для callback
    ) 
);

// Общий callback-обработчик
function ch_essentials_textbox_callback($args) { 
 
$options = get_option('ch_essentials_front_page_option'); 

echo '<input type="text" id="'  . $args[0] . '" name="ch_essentials_front_page_option['  . $args[0] . ']" value="' . $options[''  . $args[0] . ''] . '">';
 
}

Потребуется небольшая адаптация под ваши нужды, но использование общей функции для callback-обработчиков значительно сократит объем кода. В остальном, вы делаете все правильно.

--Обновление--

Вот как это должно выглядеть в вашем случае... просто модифицируйте код по необходимости, я написал его на лету... Я проверил его работоспособность. Вам нужно только адаптировать add_settings_field под свои задачи. Если нужно добавить больше полей, просто скопируйте и вставьте одно из них, затем отредактируйте. Не забудьте использовать register_setting, иначе ничего не заработает.

add_action('admin_init', 'my_general_section');  
function my_general_section() {  
    add_settings_section(  
        'my_settings_section', // ID секции
        'Мои настройки', // Заголовок секции
        'my_section_options_callback', // Callback
        'general' // На какой странице? Это делает секцию видимой на странице общих настроек
    );
    
    add_settings_field( // Опция 1
        'option_1', // ID опции
        'Опция 1', // Название
        'my_textbox_callback', // !важно - здесь передаются аргументы!
        'general', // Страница отображения (Общие настройки)
        'my_settings_section', // Название нашей секции
        array( // $args
            'option_1' // Должно совпадать с ID опции
        )  
    ); 
    
    add_settings_field( // Опция 2
        'option_2', // ID опции
        'Опция 2', // Название
        'my_textbox_callback', // !важно - здесь передаются аргументы!
        'general', // Страница отображения
        'my_settings_section', // Название нашей секции (Общие настройки)
        array( // $args
            'option_2' // Должно совпадать с ID опции
        )  
    ); 
    
    register_setting('general','option_1', 'esc_attr');
    register_setting('general','option_2', 'esc_attr');
}

function my_section_options_callback() { // Callback секции
    echo '<p>Небольшое сообщение о редактировании информации</p>';  
}

function my_textbox_callback($args) {  // Callback текстового поля
    $option = get_option($args[0]);
    echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}
10 янв. 2014 г. 02:11:21
Комментарии

Так вот что я не понимаю - это 4-й и 5-й параметры в add_settings_field(). Я знаю, что первый - это ID, второй - название, третий - callback для отображения, но для чего следующие?

У вас там ch_essentials_front_page_option для обоих, у меня просто 'general' в том же месте, следующий пустой, а последний - теперь массив args.

Теперь в callback у вас get_option с этим значением, но я не знаю, что туда ставить в моем случае.

Richard Mišenčík Richard Mišenčík
10 янв. 2014 г. 13:30:18

Внес правки, это должно полностью решить твою проблему. Дай знать, если будут вопросы или сложности. Я оставил подробные комментарии.

MrJustin MrJustin
11 янв. 2014 г. 02:31:26

@MrJusting Огромное спасибо. Вообще я разобрался, посмотрев твой профиль и изучив ответ на вопрос "Implementing-tabs-on-custom-menu-page". Там были отличные комментарии, так что я смог сравнить со своим кодом и наконец понять как это работает. Меня сбивали с толку параметры page и section - я думал, что это раздел страницы, а не раздел настроек. Теперь я объединил оба подхода и добавил еще одно значение в $args: первое - ID поля, второе - описание, а затем добавил строку в callback функцию для вывода описания через args[1] :)

Richard Mišenčík Richard Mišenčík
12 янв. 2014 г. 23:04:32

Отлично, я рад, что вы разобрались. Если возникнут вопросы, дайте мне знать.

MrJustin MrJustin
13 янв. 2014 г. 17:38:52

Думаю, сейчас попробую создать отдельную страницу меню и добавить опции туда, потому что в общем и внизу они как-то теряются. Сообщу, как это получится.

Richard Mišenčík Richard Mišenčík
13 янв. 2014 г. 18:20:45

Код в этом примере нормальный? http://wordpress.stackexchange.com/questions/127493/wordpress-settings-api-implementing-tabs-on-custom-menu-page

Richard Mišenčík Richard Mišenčík
13 янв. 2014 г. 18:26:29

Спасибо @MrJustin. Хочу отметить момент, который не увидел в ответе... чтобы отобразить опцию в вашей теме, просто используйте функцию get_option(). Пример: <?php echo get_option('option_1') ;?>

NW Tech NW Tech
14 янв. 2014 г. 20:54:23

Это сработало идеально для меня.

Jake Jake
13 янв. 2016 г. 01:14:35

Вот оно. Лучший ответ в интернете! Я потратил много часов на поиск решения. Хочу обратить внимание всех, кто наткнется на эту статью - используйте отредактированный комментарий и добавляйте всё, что вам нужно!

Mo Alsaedi Mo Alsaedi
23 сент. 2016 г. 19:54:11
Показать остальные 4 комментариев
2
-2

Лучший способ - использовать плагины для настроек WordPress. Один из лучших - Advanced Custom Fields.

http://www.advancedcustomfields.com/

Если вы приобретете дополнение для страницы настроек, то сможете создавать неограниченное количество страниц настроек с множеством функций. Посмотрите видео.

http://www.advancedcustomfields.com/add-ons/options-page/

Очень полезный плагин и дополнение.

10 янв. 2014 г. 01:56:11
Комментарии

Я просто хочу добавить несколько полей, поэтому использование плагина только для этого было бы излишним, но спасибо.

Richard Mišenčík Richard Mišenčík
10 янв. 2014 г. 13:28:25

Не говоря уже о том, что это не решает то, что хотел автор, а именно добавление полей в Общие настройки. Насколько мне известно, ACF не позволяет добавлять поля в Общие настройки.

NW Tech NW Tech
14 янв. 2014 г. 20:30:27