Для создания собственных настроек плагина WordPress используйте Settings API, а не отдельный обработчик POST с ручной записью в базу. Так WordPress берёт на себя стандартную отправку формы, а плагин отвечает за тип данных, очистку и вывод.
Когда нужен Settings API
Он подходит для небольших административных параметров: идентификатора проекта, переключателей функций, ограничений вывода. Если вы храните токены API, проектируйте отдельную модель секретов и разграничение доступа: не показывайте токены в публичных HTML-страницах и журналах.
Минимальная структура
Создайте отдельный плагин на тестовой WordPress-установке. Ниже учебный пример: значение wpr8_demo_label сохраняется в wp_options, а поле появляется в «Настройки → Пример параметра».
<?php
/**
* Plugin Name: Example Settings Page
* Description: Демонстрация Settings API.
* Version: 1.0.0
*/
add_action( 'admin_init', function () {
register_setting( 'wpr8_demo_group', 'wpr8_demo_label', array(
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
'default' => '',
) );
add_settings_section( 'wpr8_main', 'Параметр', '__return_false', 'wpr8-demo' );
add_settings_field( 'wpr8_demo_label', 'Подпись', function () {
$value = get_option( 'wpr8_demo_label', '' );
echo '<input type="text" class="regular-text" name="wpr8_demo_label" value="' . esc_attr( $value ) . '">';
}, 'wpr8-demo', 'wpr8_main' );
} );
add_action( 'admin_menu', function () {
add_options_page( 'Пример параметра', 'Пример параметра', 'manage_options', 'wpr8-demo', function () {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Нет прав доступа' );
}
echo '<div class="wrap"><h1>Пример параметра</h1><form action="options.php" method="post">';
settings_fields( 'wpr8_demo_group' );
do_settings_sections( 'wpr8-demo' );
submit_button();
echo '</form></div>';
} );
} );
Пример рассчитан на обычную административную страницу. Для продукта добавьте перевод строк, отдельные именованные функции вместо анонимных колбэков, корректную обработку миграций и сценарии удаления параметров.
Что происходит при сохранении
register_setting()описывает допустимое значение и его очистку.settings_fields()добавляет служебные поля для стандартной формы.- Запрос идёт в
wp-admin/options.php; WordPress проверяет необходимые права и служебные данные формы. get_option()возвращает сохранённое значение, аesc_attr()безопасно помещает его в атрибут HTML.
Nonce сам по себе не является авторизацией. Для административных действий нужны проверки current_user_can(); не заменяйте их проверкой наличия служебного токена.
Проверка перед релизом
- Сохранение строки и пустого значения работает без PHP-предупреждений.
- Пользователь без
manage_optionsне открывает экран и не меняет настройку. - Спецсимволы корректно отображаются после сохранения.
- После деактивации и повторной активации параметры ведут себя по задокументированному правилу.
- Параметр не выводится в публичном REST API без явной необходимости.
Связанные задачи
Когда настройки готовы, полезно отдельно разобраться с проверкой плагина через PHPUnit и пользовательским REST endpoint. Не копируйте пример целиком в продакшен без code review.
Источник: https://developer.wordpress.org/plugins/settings/using-settings-api/
Материал был полезен?
Помогите нам сделать материалы точнее и понятнее.