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

В 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 для более современного дизайна.

Как установить и настроить WPCommunity для создания форума в WordPress
07.01.2026
Оптимизация базы данных WordPress для улучшения производительности
04.01.2026
Как удалить кэш transient в WordPress для решения проблем с устаревшими данными
11.02.2026
Как создать динамические виджеты в WordPress с использованием REST API
11.01.2026
Оптимизация загрузки изображений в WordPress для ускорения сайта
06.11.2025