Почти любой проект содержит параметры, которые удобно было бы вынести в админку. Это могут быть какие то переменные для шаблона или параметры для внутреннего пользования. Рассмотрим как это сделать с минимальными усилиями.
Наиболее очевидным механизмом для хранения переменных является использование API опций (options). Здесь мы рассмотрим как наиболее просто создать дополнительные поля для редактирования опций прямо в админке WordPress.
Терминология
Но для начала надо разобраться с терминологией.
В «Настройках» есть отдельные страницы или группы опций (Общие, Написание, Чтение, …), которые могут быть поделены на секции. А в определенные секции мы уже прикрепляем опции.
Т.е. есть иерархия — группа-секция-опция.
Регистрация опций
Предварительно опция должна быть зарегистрирована функцией register_setting(). Затем специальный метод add_settings_field() позволяет описать опцию и прикрепить её в нужную секцию страницы настроек.
Если выполнить add_settings_field() без register_setting(), то хоть опция и появится в шаблоне страницы, но при сохранении её изменения не будут зафиксированы.
Как определить имя страницы (группы)?
Имя группы настроек можно подсмотреть в uri соответствующей страницы. Например, страница «обсуждение» имеет следующий адрес:
1 |
/wp-admin/options-discussion.php |
Здесь имя группы будет — discussion.
Как определить имя секции?
Полный список зарегистрированных секций можно получить из глобальной переменной — $wp_settings_sections.
Новые секции регистрируются функцией add_settings_section($id, $title, $callback, $page).
Если имена секций неизвестны (лень подсматривать), то можно использовать ‘default’.
Чтение/изменение опций
Т.к. настройки — это часть options API, то чтение и запись производится методами get_option() и update_option().
1 2 |
$value = get_option( 'my_option_name', 'default_value'); $updatedFlag = update_option( 'my_option_name', $value, $autoloadFlag); |
Что касается работы с опцией в админ панели, то сохранение зарегистрированных настроек WP производит сам.
Пример
Добавим несколько опций на страницу Настройки -> Общие. Это будет телефон, email и адрес офиса — переменные, которые потом (по легенде) будут выводится в шаблоне. Специально для них создадим секцию — ‘Контакты’.
Регистрация лучше произвести во время admin_init:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
add_action('admin_init', 'add_option_fields_to_general_admin_page'); function add_option_fields_to_general_admin_page() { //список опций, которые будем добавлять $options = array( 'firm-tel' => 'Телефон', 'firm-email' => 'Email', 'firm-addr' => 'Адрес' ); //создаём секцию add_settings_section( 'firm_setting_section', //ID секции 'Контакты', //заголовок 'firm_setting_section_cb_func', //callback шаблона 'general' //ID группы опции ); //проводим регистрацию и настройку опций foreach ($options as $ID => $label) { // регистрация на странице general ("Общие") register_setting( 'general', $ID); // выполняем настройки поля add_settings_field( 'firm' . $ID, //ID поля $label, //метка 'firm_setting_cb_func', //функция, выводящая шаблон поля 'general', //ID группы опций 'firm_setting_section', //ID секции //дополнительные параметры вывода поля array( //если задано значение label_for //то заголовок поля обрамляется тегом <label> //связанным с самим полем 'label_for' => 'firm' . $ID, //класс добавляется в tr элемент таблицы опций //для данной опции 'class' => $ID ) ); } } //кол-бэк ф-ция вывода шаблона поля function firm_setting_cb_func( $val ) { $name = $val['option_name']; echo '<input type="text" name="' . $name .'" id="' . $val['id'] .'" value="' . esc_attr( get_option($name) ) . '" />'; } function firm_setting_section_cb_func($arg) { // вывод шаблона секции, // заголовок уже выведен, тут можно добавить описание // arg содержит параметры, которые были заданы при добавлении секции echo '<p>id: ' . $arg['id'] . '</p>'; //ID секции echo '<p>title: ' . $arg['title'] . '</p>'; //заголовок echo '<p>callback: ' . $arg['callback'] . '</p>'; // имя текущей функции } |
Надеюсь, пример поможет вам сориентироваться и уже дальше развить его в то, что вам нужно на практике. Читайте также мануалы к функциям на https://developer.wordpress.org/.
Ошибки в коде
Рабочий код без ошибок:
add_action(‘admin_init’, ‘add_option_fields_to_general_admin_page’);
function add_option_fields_to_general_admin_page() {
//список опций, которые будем добавлять
$options = array(
‘my-tel’ => ‘Телефон’,
‘my-email’ => ‘Email’,
‘my-addr’ => ‘Адрес’
);
//создаём секцию
add_settings_section(
‘my_setting_section’, //ID секции
‘Контакты’, //заголовок
‘my_setting_section_cb_func’, //callback шаблона
‘general’ //ID группы опции
);
//проводим регистрацию и настройку опций
foreach ($options as $ID => $label) {
// регистрация на странице general («Общие»)
register_setting( ‘general’, $ID);
// выполняем настройки поля
add_settings_field(
$ID, //ID поля
$label, //метка
‘my_setting_cb_func’, //функция, выводящая шаблон поля
‘general’, //ID группы опций
‘my_setting_section’, //ID секции
array(
‘id’ => $ID,
‘option_name’ => $ID
)
);
}
}
//кол-бэк ф-ция вывода шаблона поля
function my_setting_cb_func( $val ){
$name = $val[‘option_name’];
echo »;
}
function my_setting_section_cb_func($arg){
// вывод шаблона секции,
// заголовок уже выведен, тут можно добавить описание
// arg содержит параметры, которые были заданы при добавлении секции
echo ‘id: ‘ . $arg[‘id’] . »; //ID секции
echo ‘title: ‘ . $arg[‘title’] . »; //заголовок
echo ‘callback: ‘ . $arg[‘callback’] . »; // имя текущей функции
}
Код не рабочий