Как создать настройки плагина WordPress: подробное руководство для разработчиков

Каждому разработчику плагинов для WordPress рано или поздно приходится создавать интерфейс настроек. Это необходимо для того, чтобы пользователи могли гибко управлять функционалом плагина без правки кода. В этой статье мы подробно рассмотрим, как создать удобный и безопасный раздел настроек для вашего плагина, используя нативные возможности WordPress.

Почему важно создавать собственные настройки для плагина

Настройки дают пользователю контроль над поведением плагина, делают его более универсальным и востребованным. Без настроек ваш плагин будет либо жестко фиксированным, либо потребует вмешательства в код, что недопустимо для большинства пользователей.

Правильно оформленные настройки повышают доверие к плагину и помогают избежать конфликтов и ошибок. Кроме того, использование стандартных API WordPress для настроек гарантирует совместимость и безопасность.

Используемые инструменты WordPress для создания настроек

WordPress предоставляет несколько основных функций и API для работы с настройками:

  • add_options_page() — добавляет страницу настроек в меню администратора;
  • register_setting() — регистрирует группу настроек для безопасного сохранения;
  • add_settings_section() — добавляет секцию на страницу настроек;
  • add_settings_field() — добавляет отдельное поле настройки;
  • Функции get_option() и update_option() для чтения и записи данных.

Использование этого набора обеспечивает стандартизированный и безопасный интерфейс.

Шаг 1. Добавляем страницу настроек в админ-панель WordPress

Для начала создадим функцию, которая добавит страницу настроек в меню «Настройки».

function wpdigest_add_settings_page() {
    add_options_page(
        'Настройки плагина WP Digest',
        'WP Digest',
        'manage_options',
        'wpdigest-settings',
        'wpdigest_render_settings_page'
    );
}
add_action('admin_menu', 'wpdigest_add_settings_page');

Параметры функции понятны: заголовок страницы, название меню, права доступа, слаг страницы и callback для вывода содержимого.

Шаг 2. Регистрируем настройки, секции и поля

Теперь нам нужно зарегистрировать настройки и определить поля ввода.

function wpdigest_register_settings() {
    register_setting('wpdigest_options_group', 'wpdigest_options', 'wpdigest_sanitize_options');

    add_settings_section(
        'wpdigest_main_section',
        'Основные настройки',
        'wpdigest_main_section_cb',
        'wpdigest-settings'
    );

    add_settings_field(
        'wpdigest_text_field',
        'Текстовое поле',
        'wpdigest_text_field_cb',
        'wpdigest-settings',
        'wpdigest_main_section'
    );

    add_settings_field(
        'wpdigest_checkbox_field',
        'Флажок',
        'wpdigest_checkbox_field_cb',
        'wpdigest-settings',
        'wpdigest_main_section'
    );
}
add_action('admin_init', 'wpdigest_register_settings');

Здесь мы определили группу настроек wpdigest_options_group, одну секцию и два поля — текстовое и чекбокс.

Обработчики секции и полей

Функции обратного вызова для вывода описаний и полей выглядят так:

function wpdigest_main_section_cb() {
    echo '<p>Настройте основные параметры плагина здесь.</p>';
}

function wpdigest_text_field_cb() {
    $options = get_option('wpdigest_options');
    $value = isset($options['text_field']) ? esc_attr($options['text_field']) : '';
    echo "<input type='text' name='wpdigest_options[text_field]' value='$value' class='regular-text' />";
}

function wpdigest_checkbox_field_cb() {
    $options = get_option('wpdigest_options');
    $checked = !empty($options['checkbox_field']) ? 'checked' : '';
    echo "<input type='checkbox' name='wpdigest_options[checkbox_field]' value='1' $checked />";
}

Шаг 3. Обработка и валидация данных

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

function wpdigest_sanitize_options($input) {
    $output = array();

    if (isset($input['text_field'])) {
        $output['text_field'] = sanitize_text_field($input['text_field']);
    }

    $output['checkbox_field'] = !empty($input['checkbox_field']) ? 1 : 0;

    return $output;
}

Эта функция удаляет опасные символы из текста и гарантирует, что чекбокс будет либо 1, либо 0.

Шаг 4. Вывод страницы настроек

Теперь создадим функцию, которая выведет форму настроек на страницу.

function wpdigest_render_settings_page() {
    if (!current_user_can('manage_options')) {
        return;
    }

    if (isset($_GET['settings-updated'])) {
        add_settings_error('wpdigest_messages', 'wpdigest_message', 'Настройки сохранены', 'updated');
    }

    settings_errors('wpdigest_messages');
    ?>
    <div class="wrap">
        <h1>Настройки плагина WP Digest</h1>
        <form action='options.php' method='post'>
            <?php
            settings_fields('wpdigest_options_group');
            do_settings_sections('wpdigest-settings');
            submit_button('Сохранить настройки');
            ?>
        </form>
    </div>
    <?php
}

Функции settings_fields() и do_settings_sections() автоматически формируют необходимые скрытые поля и выводят все секции с полями.

Практические советы по улучшению UX настроек

Настройки — это не просто набор полей. От их удобства зависит восприятие всего плагина. Вот несколько рекомендаций:

  • Группируйте параметры по логическим разделам, используйте add_settings_section() для этого.
  • Добавляйте пояснения к полям и секциям, чтобы пользователь понимал назначение каждого параметра.
  • Используйте разные типы полей: текстовые, селекты, чекбоксы, радиокнопки для удобства.
  • Добавляйте валидацию и показывайте ошибки при неправильном вводе.
  • Минимизируйте количество настроек, оставляя только необходимые.

Пример расширения: сохранение массива настроек и их использование

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

function wpdigest_register_settings() {
    register_setting('wpdigest_options_group', 'wpdigest_options', 'wpdigest_sanitize_options');

    add_settings_section('wpdigest_email_section', 'Настройки Email', null, 'wpdigest-settings');

    add_settings_field(
        'wpdigest_emails',
        'Email для рассылки (через запятую)',
        'wpdigest_emails_field_cb',
        'wpdigest-settings',
        'wpdigest_email_section'
    );
}

function wpdigest_emails_field_cb() {
    $options = get_option('wpdigest_options');
    $value = isset($options['emails']) ? esc_textarea($options['emails']) : '';
    echo "<textarea name='wpdigest_options[emails]' rows='5' cols='50'>$value</textarea>";
}

function wpdigest_sanitize_options($input) {
    $output = array();

    if (isset($input['emails'])) {
        $emails_raw = explode(',', $input['emails']);
        $clean_emails = array();
        foreach ($emails_raw as $email) {
            $email_trimmed = trim($email);
            if (is_email($email_trimmed)) {
                $clean_emails[] = $email_trimmed;
            }
        }
        $output['emails'] = implode(', ', $clean_emails);
    }

    // Остальные поля как ранее
    return $output;
}

Так мы принимаем список email, фильтруем их и сохраняем в едином формате.

Заключение: создание настроек — это просто и эффективно

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

Если вы хотите углубиться, изучите классы Settings API и сторонние библиотеки для UI, например, Settings Framework или CMB2, которые ускоряют разработку сложных интерфейсов.

Таким образом, создание настроек — не сложно и значительно повышает качество вашего плагина.

Динамический фильтрованный список записей WordPress с WP_Query и AJAX
11.12.2025
Как отключить автовоспроизведение видео в WordPress
08.01.2026
WooCommerce: как установить лимит на количество товаров в корзине
17.04.2026
WooCommerce: как автоматически изменять наличие товаров и отключать оформление заказа при отсутствии товара
29.06.2026
Как автоматизировать удаление старого контента в WordPress: практические решения и примеры кода
31.03.2026