wpinc.ru wordpress WP Inc

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

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

Что такое настройки в WordPress и зачем они нужны

Настройки — это данные, которые сайт хранит для управления поведением плагинов или темы. WordPress предоставляет API для удобного создания и обработки таких настроек, включая страницы в админке, где администратор может менять параметры без прямого редактирования кода.

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

Рассмотрим, как это реализовать на практике с нуля.

Регистрация страницы настроек в меню админ панели WordPress

Первый шаг — добавить новую страницу меню в админку. Для этого используем хук admin_menu и функцию add_options_page, которая добавит пункт в меню «Настройки».

add_action('admin_menu', 'wpinc_add_settings_page');

function wpinc_add_settings_page() {
    add_options_page(
        'Настройки WPINC', // Заголовок страницы
        'Настройки WPINC', // Текст меню
        'manage_options',    // Права доступа
        'wpinc-settings',    // slug страницы
        'wpinc_render_settings_page' // Функция вывода
    );
}

В данном примере создается страница с заголовком и названием в меню «Настройки WPINC». Функция wpinc_render_settings_page будет отвечать за вывод содержимого.

Вывод формы настроек на странице

Чтобы сохранить настройки, WordPress рекомендует использовать Settings API. Для начала создадим форму с использованием функций settings_fields и do_settings_sections.

function wpinc_render_settings_page() {
    ?>
    <div class="wrap">
        <h1>Настройки WPINC</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('wpinc_options_group');
            do_settings_sections('wpinc-settings');
            submit_button();
            ?>
        </form>
    </div>
    <?php
}

Здесь мы вызываем settings_fields с именем группы опций, которую зарегистрируем дальше, и do_settings_sections для вывода секций и полей.

Регистрация настроек, секций и полей с помощью Settings API

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

add_action('admin_init', 'wpinc_register_settings');

function wpinc_register_settings() {
    // Регистрируем опцию
    register_setting('wpinc_options_group', 'wpinc_options', 'wpinc_sanitize_options');

    // Добавляем секцию
    add_settings_section(
        'wpinc_main_section',
        'Основные настройки',
        'wpinc_main_section_cb',
        'wpinc-settings'
    );

    // Добавляем поле
    add_settings_field(
        'wpinc_text_field',
        'Текстовое поле',
        'wpinc_text_field_cb',
        'wpinc-settings',
        'wpinc_main_section'
    );
}

Здесь мы создаем группу настроек wpinc_options_group, регистрируем опцию wpinc_options (которая будет хранить массив с настройками), добавляем секцию и поле для ввода текста.

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

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

function wpinc_main_section_cb() {
    echo '<p>Настройки плагина WPINC для управления поведением сайта.</p>';
}

Функция для поля выводит HTML для ввода значения. Значения берем из опций.

function wpinc_text_field_cb() {
    $options = get_option('wpinc_options');
    ?>
    <input type="text" name="wpinc_options[wpinc_text_field]" value="<?php echo isset($options['wpinc_text_field']) ? esc_attr($options['wpinc_text_field']) : ''; ?>" />
    <?php
}

Обработка и валидация данных настроек

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

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

    if (isset($input['wpinc_text_field'])) {
        // Очищаем текстовое поле
        $output['wpinc_text_field'] = sanitize_text_field($input['wpinc_text_field']);
    }

    return $output;
}

В этой функции мы явно очищаем каждое поле. Если в будущем добавите новые поля, следует дописать их обработку.

Пример расширения: добавление чекбокса и выпадающего списка

Рассмотрим, как добавить еще два поля — чекбокс для включения функции и выпадающий список с вариантами.

add_settings_field(
    'wpinc_checkbox_field',
    'Включить функцию',
    'wpinc_checkbox_field_cb',
    'wpinc-settings',
    'wpinc_main_section'
);

add_settings_field(
    'wpinc_select_field',
    'Выберите опцию',
    'wpinc_select_field_cb',
    'wpinc-settings',
    'wpinc_main_section'
);

function wpinc_checkbox_field_cb() {
    $options = get_option('wpinc_options');
    $checked = isset($options['wpinc_checkbox_field']) && $options['wpinc_checkbox_field'] ? 'checked' : '';
    ?>
    <input type="checkbox" name="wpinc_options[wpinc_checkbox_field]" value="1" <?php echo $checked; ?> />
    <?php
}

function wpinc_select_field_cb() {
    $options = get_option('wpinc_options');
    $value = isset($options['wpinc_select_field']) ? $options['wpinc_select_field'] : '';
    $choices = array('option1' => 'Опция 1', 'option2' => 'Опция 2', 'option3' => 'Опция 3');
    ?>
    <select name="wpinc_options[wpinc_select_field]">
        <?php foreach ($choices as $key => $label): ?>
            <option value="<?php echo esc_attr($key); ?>" <?php selected($value, $key); ?>><?php echo esc_html($label); ?></option>
        <?php endforeach; ?>
    </select>
    <?php
}

И не забудьте добавить их в функцию валидации:

function wpinc_sanitize_options($input) {
    $output = array();
    if (isset($input['wpinc_text_field'])) {
        $output['wpinc_text_field'] = sanitize_text_field($input['wpinc_text_field']);
    }
    $output['wpinc_checkbox_field'] = !empty($input['wpinc_checkbox_field']) ? 1 : 0;

    $valid_options = array('option1', 'option2', 'option3');
    if (isset($input['wpinc_select_field']) && in_array($input['wpinc_select_field'], $valid_options)) {
        $output['wpinc_select_field'] = $input['wpinc_select_field'];
    } else {
        $output['wpinc_select_field'] = 'option1'; // Значение по умолчанию
    }

    return $output;
}

Использование сохраненных настроек в коде плагина

Данные, сохраненные через нашу форму, доступны через функцию get_option('wpinc_options'). Это массив с ключами, соответствующими именам полей. Пример использования:

$options = get_option('wpinc_options');
if (!empty($options['wpinc_checkbox_field'])) {
    // Включаем дополнительную функциональность
}

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

Полезные плагины для расширения и упрощения работы с настройками

Если вам не хочется писать код вручную, можно использовать плагины, которые облегчают создание страниц настроек:

  • Advanced Custom Fields (ACF) — позволяет создавать сложные поля и группы настроек с удобным интерфейсом.
  • Settings API Plugin — визуальный интерфейс для создания страниц настроек на базе WordPress Settings API.
  • Custom Settings Framework — облегчает работу с настройками и хранением данных.

Однако знание базового подхода через Settings API дает максимальную гибкость и контроль.

Советы по безопасности и производительности

При работе с настройками всегда проверяйте права доступа (manage_options) и используйте nonce для защиты форм. Не забывайте фильтровать и экранировать данные при выводе.

Для производительности не храните большие объемы данных в опциях, лучше использовать пользовательские таблицы или transient API, если нужно временное кэширование.

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

×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙