В WordPress управление темами обычно осуществляется через админ-панель, но иногда требуется создать собственный интерфейс выбора темы с дополнительными условиями или ограничениями. В этой статье мы разберем, как с помощью хуков и простого кода реализовать настройку выбора темы для сайта, например, для мультисайта или при специфичных требованиях к смене оформления.
Почему стоит создавать собственную настройку выбора темы в WordPress
По умолчанию WordPress позволяет активировать темы через внешний вид > Темы. Однако при необходимости автоматизировать или ограничить выбор тем для определенных пользователей, сайтов или условий полезно создавать собственные инструменты. Это особенно актуально при работе с мультисайтами, кастомными проектами и системами с ограниченными правами.
С помощью хуков WordPress мы можем добавить в админ-панель свою страницу с выбором темы, сделать проверку прав, сохранить выбранную тему и автоматически применять её при загрузке сайта.
Такой подход помогает избежать ручных ошибок, повысить удобство управления и расширить функциональность без изменения ядра.
Добавление страницы настройки выбора темы в админку
Для начала создадим в своем плагине или в файле functions.php код, который добавит новую страницу настроек с формой выбора темы.
add_action('admin_menu', 'wpteam_add_theme_selector_page');
function wpteam_add_theme_selector_page() {
add_theme_page(
'Выбор темы',
'Выбор темы',
'manage_options',
'wpteam-theme-selector',
'wpteam_render_theme_selector_page'
);
}
function wpteam_render_theme_selector_page() {
if (!current_user_can('manage_options')) {
wp_die('Нет прав доступа');
}
// Обработка отправки формы
if (isset($_POST['wpteam_theme'])) {
check_admin_referer('wpteam_theme_selector_save');
$theme = sanitize_text_field($_POST['wpteam_theme']);
update_option('wpteam_selected_theme', $theme);
echo '<div class="updated"><p>Тема сохранена!</p></div>';
}
$themes = wp_get_themes();
$current_theme = get_option('wpteam_selected_theme', get_stylesheet());
echo '<div class="wrap">';
echo '<h1>Выбор темы сайта</h1>';
echo '<form method="post" action="">';
wp_nonce_field('wpteam_theme_selector_save');
echo '<select name="wpteam_theme">';
foreach ($themes as $slug => $theme) {
$selected = ($slug === $current_theme) ? ' selected' : '';
echo "<option value=\"$slug\"$selected>" . esc_html($theme->get('Name')) . "</option>";
}
echo '</select>';
echo '<input type="submit" class="button button-primary" value="Сохранить" />';
echo '</form></div>';
}
Здесь мы добавили страницу в меню Темы, где выводится список всех доступных тем и форма выбора. При сохранении выбранная тема сохраняется в опции wpteam_selected_theme.
Автоматическое применение выбранной темы на сайте
Теперь нам нужно, чтобы при загрузке сайта применялась тема, которая выбрана через нашу форму, а не активная по умолчанию. Для этого используем фильтр template и stylesheet, которые отвечают за активную тему.
add_filter('template', 'wpteam_filter_active_template');
add_filter('stylesheet', 'wpteam_filter_active_stylesheet');
function wpteam_filter_active_template($template) {
$selected = get_option('wpteam_selected_theme');
if ($selected) {
$theme = wp_get_theme($selected);
if ($theme->exists()) {
return $selected;
}
}
return $template;
}
function wpteam_filter_active_stylesheet($stylesheet) {
$selected = get_option('wpteam_selected_theme');
if ($selected) {
$theme = wp_get_theme($selected);
if ($theme->exists()) {
return $selected;
}
}
return $stylesheet;
}
Эти фильтры подменяют активную тему на выбранную нами из настроек, если она существует. Таким образом, даже если в админке активирована другая тема, на фронтенде будет работать наша выбранная.
Дополнительные улучшения: проверка прав и уведомления
Для повышения надежности можно добавить проверку, чтобы выбор темы могли делать только администраторы или определенные роли. В примере выше мы уже используем current_user_can('manage_options'), что ограничивает доступ.
Также полезно уведомлять пользователя, если выбранная тема была удалена или повреждена. Для этого в функции фильтра можно возвращать дефолтную тему и выводить админ-уведомление:
add_action('admin_notices', 'wpteam_theme_missing_notice');
function wpteam_theme_missing_notice() {
$selected = get_option('wpteam_selected_theme');
if ($selected) {
$theme = wp_get_theme($selected);
if (!$theme->exists()) {
echo '<div class="notice notice-error">';
echo '<p>Выбранная тема "' . esc_html($selected) . '" не найдена. Пожалуйста, выберите другую тему в настройках.</p>';
echo '</div>';
}
}
}
Применение на мультисайтах и в плагинах
Данный подход отлично подходит и для мультисайтов, где можно сохранять тему для каждого сайта индивидуально (используя функции get_blog_option и update_blog_option вместо обычных). Также эту логику удобно обернуть в плагин, который позволит клиентам или редакторам выбирать темы без доступа к полной админке.
Пример вызова для мультисайта:
function wpteam_get_selected_theme($blog_id = null) {
if (!$blog_id) {
$blog_id = get_current_blog_id();
}
return get_blog_option($blog_id, 'wpteam_selected_theme');
}
И соответствующее сохранение:
update_blog_option($blog_id, 'wpteam_selected_theme', $theme_slug);
Заключение
Создание собственной настройки выбора темы в WordPress с помощью хуков — это мощный инструмент для кастомизации и автоматизации управления внешним видом сайта. Такой метод позволяет реализовать гибкие сценарии, экономить время на ручной настройке и повысить удобство администрирования.
Если вы хотите расширить функциональность, можете интегрировать эти возможности с плагинами, например, с Clearfy Pro для дополнительной оптимизации или с темой Reboot для более современного дизайна.