Пишем плагин для WordPress
Для того чтобы не изобретать велосипеды, необходимо с генерировать шаблоны файлов плагина. Например при помощи этого сервиса. В моём случае плагин называется ssk_read, поэтому далее везде фигурирует в названиях файлов он.
Получится структура папок вида:

Необходимо поместить все файлы в папку /wp_content/plugins..и собственно на этом моменте плагин уже будет доступен в админке для ативации.

Далее попробуем нарисовать страницу настроек в панели администрирования. Для этого добавим в /admin/class-ssk_read-admin.php в функцию конструкта класса хук добавления пункта меню:
add_action( 'admin_menu', 'register_my_config_page');
И далее в основном теле плагина skk_read.php добавим функцию register_my_config_page, которая непосредственно регистрирует этот пункт меню к выводу на экран:
function register_my_config_page(){
add_menu_page( 'SSK_Read', 'SSK_Read', 'edit_others_posts','ssk_read', 'DrawPage', plugins_url( 'ssk_read/images/logo.png' ), 6 );
}
function DrawPage(){
?>
<h1 class="wp-heading-inline">Основные настройки</h1>
<?php
};
После этого в меню админки появится новый пункт меню, с выводом пустой страницы. Добавим в функцию DrawPage функционал вывода сохраненных настроек:
function DrawPage(){
?>
<h1 class="wp-heading-inline">Основные настройки</h1>
<form method="post" action="options.php">
<?php
settings_fields('ssk_read_settings');
do_settings_sections( 'ssk_read');
submit_button();
?>
</form>
<?php
};
На этом этапе пока появится только кнопка «сохранить изменения», потому как мы еще не указали ядру, какие именно настройки мы хотим хранить. Для этого добавим в /admin/class-ssk_read-admin.php в функцию конструкта класса хук инициализации настроек:
add_action( 'admin_init', 'ssk_read_fields');
И далее в основном классе ssk_read.php добавим функции регистрации полей и их вывода:
function ssk_read_fields(){
register_setting('ssk_read_settings','api_doc_url','string');
register_setting('ssk_read_settings','api_doc_login','string');
register_setting('ssk_read_settings','api_doc_password','string');
add_settings_section( 'ssk_settings_section_id', 'Соединение с 1С Документооборот','', 'ssk_read' );
add_settings_field('api_doc_url','URL вызова API','DrawApiTxtField','ssk_read','ssk_settings_section_id',array('name' => 'api_doc_url'));
add_settings_field('api_doc_login','Логин','DrawApiTxtField','ssk_read','ssk_settings_section_id',array('name' => 'api_doc_login'));
add_settings_field('api_doc_password','Пароль','DrawApiPasswordField','ssk_read','ssk_settings_section_id',array('name' => 'api_doc_password'));
}
function DrawApiTxtField($args){
$value = get_option( $args[ 'name' ] );
echo '<input type="text" id="'.$args[ 'name' ].'" name="'.$args[ 'name' ].'" value="'.$value.'" />';
}
function DrawApiPasswordField($args){
$value = get_option( $args[ 'name' ] );
echo '<input type="password" id="'.$args[ 'name' ].'" name="'.$args[ 'name' ].'" value="'.$value.'" />';
}
Получилось функционирующее сохранение:

Однако не хватает уведомления об успешном сохранении. Добавим хук:
add_action( 'admin_notices', 'ssk_custom_notice' );
И вывод сообщения:
function ssk_custom_notice(){
if (
isset( $_GET[ 'page' ] )
&& 'ssk_read' == $_GET[ 'page' ]
&& isset( $_GET[ 'settings-updated' ] )
&& true == $_GET[ 'settings-updated' ]
) {
echo '<div class="notice notice-success is-dismissible"><p>Настройки сохранены!</p></div>';
}
}