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

22

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

Я хотел бы создать два поля на данный момент, одно для номера телефона и второе для адреса:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('My 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 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 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но он просто не работал или не сохранял и т.д. Это просто очень запутанно.

Ричард Мишенчик
источник

Ответы:

26

Ну, второй бит кода технически правильный способ сделать это. Тем не менее, в конце add_settings_field()вы можете передать аргументы.

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

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

Вот пример того, как я это делаю.

// My Example Fields
add_settings_field(  
    'tutorial_display_count',                      
    'Tutorial Display Count',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'tutorial_display_count' // $args for callback
    ) 
);
add_settings_field(  
    'blog_display_count',                      
    'Blog Display Count',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'blog_display_count'  // $args for callback
    ) 
);

// My Shared 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] . ''] . '"></input>';

}

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

--Редактировать--

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

add_action('admin_init', 'my_general_section');  
function my_general_section() {  
    add_settings_section(  
        'my_settings_section', // Section ID 
        'My Options Title', // Section Title
        'my_section_options_callback', // Callback
        'general' // What Page?  This makes the section show up on the General Settings Page
    );

    add_settings_field( // Option 1
        'option_1', // Option ID
        'Option 1', // Label
        'my_textbox_callback', // !important - This is where the args go!
        'general', // Page it will be displayed (General Settings)
        'my_settings_section', // Name of our section
        array( // The $args
            'option_1' // Should match Option ID
        )  
    ); 

    add_settings_field( // Option 2
        'option_2', // Option ID
        'Option 2', // Label
        'my_textbox_callback', // !important - This is where the args go!
        'general', // Page it will be displayed
        'my_settings_section', // Name of our section (General Settings)
        array( // The $args
            'option_2' // Should match Option ID
        )  
    ); 

    register_setting('general','option_1', 'esc_attr');
    register_setting('general','option_2', 'esc_attr');
}

function my_section_options_callback() { // Section Callback
    echo '<p>A little message on editing info</p>';  
}

function my_textbox_callback($args) {  // Textbox Callback
    $option = get_option($args[0]);
    echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}
MrJustin
источник
Так что я не понимаю, это 4-й и 5-й параметр в add_settings_field (). Я знаю, что первый - это идентификатор, второй - это имя, третий - обратный вызов для его отображения, но для чего нужны следующие? У вас есть ch_essentials_front_page_option для них обоих, у меня просто «общие» в том же месте, следующий пустой, а последний теперь массив args. Так что теперь в обратном вызове у вас есть get_option с этим значением, но я не знаю, что там делать в моем случае.
Ричард Мишенчик
2
Правка была сделана, это должно заставить вас работать на 100%. Дайте мне знать, если у вас есть какие-либо проблемы или вопросы. Я серьезно прокомментировал это.
MrJustin
@ MrJusting Большое спасибо. Я на самом деле получил его, посмотрев на ваш профиль и проверив вопрос, на который вы ответили: «Реализация вкладок на пользовательском меню». Это было очень хорошо прокомментировано, поэтому я сравнил свой код и наконец понял, как он работает. Для меня параметры страницы и раздела сбивали с толку, хотя я был похож на раздел страницы, а не на раздел настроек. Итак, теперь я объединил их вместе и добавил еще одно значение в $ args, поэтому сначала это идентификатор поля, а второе - описание, а затем добавил еще одну строку в функцию обратного вызова, чтобы
отобразить
Отлично, я рад, что вы поняли это, если у вас есть какие-либо вопросы, дайте мне знать.
Джастин
Думаю, я сейчас попробую создать отдельную страницу меню и добавить туда опции, потому что в целом и внизу ее вид потерян. Я дам вам знать, как все прошло
Ричард Мишенчик
0

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

http://www.advancedcustomfields.com/

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

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

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

Foxsk8
источник
3
Я просто хочу добавить несколько полей, так что плагин только для этого был бы излишним для меня, но спасибо.
Ричард Мишенчик
8
Не говоря уже о том, что это не решает то, что хотел ОП, а именно добавлять поля в Общие настройки. AFAIK, ACF не позволяет вам добавлять поля в общих настройках.
NW Tech