Создание собственной страницы настроек для темы WordPress — важный этап в разработке, если вы хотите дать пользователям удобный интерфейс для управления параметрами темы без необходимости редактировать код.
Зачем нужны настройки темы в админке WordPress
Встроенные настройки позволяют пользователю изменять различные аспекты темы: цвета, шрифты, лого, социальные ссылки и многое другое. Это повышает удобство и гибкость, а также делает вашу тему более профессиональной и готовой к публикации.
Без таких настроек пользователю пришлось бы лезть в файлы темы или использовать кастомные шорткоды, что не всегда удобно и безопасно.
В этой статье мы рассмотрим, как с помощью стандартных возможностей WordPress создать собственную страницу настроек в админке темы wp0.ru, используя API настроек WordPress (Settings API).
Подготовка: подключение страницы настроек в админку
Для начала нужно создать меню настроек в админке. Сделаем это через хук admin_menu и функцию add_theme_page(), которая добавит страницу именно в раздел "Внешний вид".
function wp0ru_add_theme_settings_page() {
add_theme_page(
'Настройки темы wp0.ru', // Заголовок страницы
'Настройки темы wp0.ru', // Текст меню
'edit_theme_options', // Права доступа
'wp0ru-theme-settings', // Уникальный slug
'wp0ru_render_settings_page' // Функция вывода
);
}
add_action('admin_menu', 'wp0ru_add_theme_settings_page');Функция wp0ru_render_settings_page создаст HTML интерфейс страницы настроек.
Регистрация настроек и создание полей
WordPress рекомендует использовать Settings API для правильной регистрации настроек, валидации и вывода полей. Следующий шаг — зарегистрировать настройку и добавить секции и поля.
function wp0ru_register_theme_settings() {
register_setting('wp0ru_theme_options_group', 'wp0ru_theme_options', 'wp0ru_validate_theme_options');
add_settings_section(
'wp0ru_main_section',
'Основные настройки',
'wp0ru_main_section_callback',
'wp0ru-theme-settings'
);
add_settings_field(
'wp0ru_logo',
'Логотип сайта',
'wp0ru_logo_field_callback',
'wp0ru-theme-settings',
'wp0ru_main_section'
);
add_settings_field(
'wp0ru_facebook',
'Ссылка на Facebook',
'wp0ru_facebook_field_callback',
'wp0ru-theme-settings',
'wp0ru_main_section'
);
}
add_action('admin_init', 'wp0ru_register_theme_settings');Здесь мы зарегистрировали группу настроек, добавили секцию и два поля: логотип и ссылку на Facebook.
Описание функции обратного вызова секции
Функция wp0ru_main_section_callback выводит описание секции:
function wp0ru_main_section_callback() {
echo '<p>Настройте основные параметры вашей темы wp0.ru.</p>';
}Вывод полей ввода
Для логотипа используем поле загрузки изображения с помощью стандартного медиа-загрузчика WordPress:
function wp0ru_logo_field_callback() {
$options = get_option('wp0ru_theme_options');
$logo = isset($options['logo']) ? esc_url($options['logo']) : '';
?>
<input type="text" id="wp0ru_logo" name="wp0ru_theme_options[logo]" value="<?php echo $logo; ?>" style="width:60%;" />
<input type="button" class="button" id="wp0ru_logo_button" value="Загрузить логотип" />
<script>
jQuery(document).ready(function($){
var mediaUploader;
$('#wp0ru_logo_button').click(function(e) {
e.preventDefault();
if (mediaUploader) {
mediaUploader.open();
return;
}
mediaUploader = wp.media.frames.file_frame = wp.media({
title: 'Выберите или загрузите логотип',
button: { text: 'Использовать это изображение' },
multiple: false
});
mediaUploader.on('select', function() {
attachment = mediaUploader.state().get('selection').first().toJSON();
$('#wp0ru_logo').val(attachment.url);
});
mediaUploader.open();
});
});
</script>
<?php
}Для ссылки Facebook просто текстовое поле:
function wp0ru_facebook_field_callback() {
$options = get_option('wp0ru_theme_options');
$facebook = isset($options['facebook']) ? esc_url($options['facebook']) : '';
echo "<input type='url' name='wp0ru_theme_options[facebook]' value='$facebook' style='width:60%;' placeholder='https://facebook.com/yourpage'>";
}Валидация и сохранение опций
Для безопасности и корректности данных реализуем функцию валидации:
function wp0ru_validate_theme_options($input) {
$output = array();
if (isset($input['logo']) && filter_var($input['logo'], FILTER_VALIDATE_URL)) {
$output['logo'] = esc_url_raw($input['logo']);
}
if (isset($input['facebook']) && filter_var($input['facebook'], FILTER_VALIDATE_URL)) {
$output['facebook'] = esc_url_raw($input['facebook']);
}
return $output;
}Эта функция проверяет, что введённые значения — корректные URL, и очищает их.
Вывод страницы настроек в админке
Теперь создаём функцию, которая выводит форму с настройками:
function wp0ru_render_settings_page() {
?>
<div class="wrap">
<h1>Настройки темы wp0.ru</h1>
<form method="post" action="options.php">
<?php
settings_fields('wp0ru_theme_options_group');
do_settings_sections('wp0ru-theme-settings');
submit_button();
?>
</form>
</div>
<?php
}Как использовать сохранённые опции в теме
После того как пользователь сохранит настройки, вы можете получить их в файлах темы так:
$wp0ru_options = get_option('wp0ru_theme_options');
$logo_url = isset($wp0ru_options['logo']) ? $wp0ru_options['logo'] : get_template_directory_uri() . '/images/default-logo.png';
$facebook_url = isset($wp0ru_options['facebook']) ? $wp0ru_options['facebook'] : '#';
// Вывод логотипа
echo '<img src="' . esc_url($logo_url) . '" alt="Логотип">';
// Ссылка на Facebook
echo '<a href="' . esc_url($facebook_url) . '" target="_blank" rel="noopener">Facebook</a>';Это позволяет динамически изменять элементы темы в зависимости от настроек пользователя без правки кода.
Советы по безопасности и удобству
При работе с настройками важно фильтровать и валидировать все входные данные, чтобы исключить возможность XSS и других уязвимостей.
Используйте функции esc_url_raw при сохранении и esc_url при выводе URL, а также esc_html для текстовых значений.
Для улучшения UX можно добавить визуальный предпросмотр логотипа рядом с полем ввода.
Заключение
Создание собственной страницы настроек темы в админке WordPress — это несложно, если использовать Settings API и стандартные хуки. Такой подход улучшит удобство для конечных пользователей и сделает вашу тему более функциональной и профессиональной.
В данном примере мы рассмотрели базовые поля и загрузку изображения, но по аналогии можно добавлять любые другие настройки: цвета, шрифты, тексты и т.д.