Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки и страницы панели

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

Чтение и запись

update_option('mytheme_phone', '+7 900 000-00-00');
 
$phone = get_option('mytheme_phone', '');
 
delete_option('mytheme_phone');

Второй аргумент get_option() — значение, если настройки ещё нет. Значением может быть и массив: WordPress сохранит его сам.

Вывод в шаблоне

<?php
// header.php
 
$phone = get_option('mytheme_phone');
 
if ($phone) {
    printf('<a href="tel:%s">%s</a>', esc_attr(preg_replace('/[^+\d]/', '', $phone)), esc_html($phone));
}

Страница в панели

// functions.php
 
add_action('admin_menu', function () {
    add_options_page(
        'Настройки темы',
        'Тема',
        'manage_options',
        'mytheme',
        'mytheme_render_settings',
    );
});

Аргументы: заголовок страницы, название в меню, необходимое право, адрес страницы и функция, которая её выводит. Пункт появится в разделе «Настройки».

ФункцияКуда добавляет пункт
add_options_page()В раздел «Настройки»
add_menu_page()В главное меню панели
add_submenu_page()В подменю любого раздела
add_theme_page()В раздел «Внешний вид»

Регистрация настроек

Settings API берёт на себя сохранение, проверку токена и прав:

add_action('admin_init', function () {
    register_setting('mytheme', 'mytheme_phone', [
        'type' => 'string',
        'sanitize_callback' => 'sanitize_text_field',
        'default' => '',
    ]);
 
    add_settings_section('mytheme_contacts', 'Контакты', '__return_null', 'mytheme');
 
    add_settings_field('mytheme_phone', 'Телефон', function () {
        printf(
            '<input type="text" name="mytheme_phone" value="%s" class="regular-text">',
            esc_attr(get_option('mytheme_phone', '')),
        );
    }, 'mytheme', 'mytheme_contacts');
});

sanitize_callback очищает значение перед сохранением.

Форма

function mytheme_render_settings(): void
{
    ?>
    <div class="wrap">
        <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
 
        <form method="post" action="options.php">
            <?php
            settings_fields('mytheme');
            do_settings_sections('mytheme');
            submit_button();
            ?>
        </form>
    </div>
    <?php
}

settings_fields() выводит скрытые поля с токеном, do_settings_sections() — разделы и поля, submit_button() — кнопку «Сохранить». Обработку формы WordPress выполняет сам.

Своя проверка

register_setting('mytheme', 'mytheme_per_page', [
    'type' => 'integer',
    'default' => 12,
    'sanitize_callback' => function ($value): int {
        $value = absint($value);
 
        return $value >= 1 && $value <= 100 ? $value : 12;
    },
]);

Автозагрузка

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

update_option('mytheme_import_log', $log, false);

Частая ошибка

Страница панели без проверки прав доступна любому вошедшему пользователю, который знает её адрес. Третий аргумент add_options_page() — manage_options — закрывает её от всех, кроме администраторов. Если форму обрабатывает ваш собственный код, а не Settings API, проверяйте в нём и право current_user_can('manage_options'), и токен функцией check_admin_referer().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.