ворд-пресс.рф
Разработка

Настройки плагина WordPress: Settings API и собственная страница в админке

Как добавить страницу настроек плагина, зарегистрировать параметр, проверить сохранение и защитить доступ.

Для создания собственных настроек плагина 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>';
    } );
} );

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

Что происходит при сохранении

  1. register_setting() описывает допустимое значение и его очистку.
  2. settings_fields() добавляет служебные поля для стандартной формы.
  3. Запрос идёт в wp-admin/options.php; WordPress проверяет необходимые права и служебные данные формы.
  4. 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/

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.