Добавление нескольких произвольных полей на страницу общих настроек
Я хочу добавить несколько произвольных полей в общие настройки. Вот код, который я использую. Он работает нормально, но я не могу понять, как добавить больше полей.
Я хочу создать два поля: одно для номера телефона и второе для адреса:
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
, но это просто не работало или не сохранялось и т.д. Это очень запутанно.

Второй фрагмент кода технически является правильным способом реализации. Однако, в конце функции 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 . '" />';
}

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

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

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

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

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

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

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

Лучший способ - использовать плагины для настроек WordPress. Один из лучших - Advanced Custom Fields.
http://www.advancedcustomfields.com/
Если вы приобретете дополнение для страницы настроек, то сможете создавать неограниченное количество страниц настроек с множеством функций. Посмотрите видео.
http://www.advancedcustomfields.com/add-ons/options-page/
Очень полезный плагин и дополнение.

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