Настройки и страницы панели
Телефон в шапке, ключ стороннего сервиса, число товаров на странице не должны быть вписаны в код: менять их будет владелец сайта, а не программист. 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().