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

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

Почему стоит создавать переключатель темы через настройки

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

  • Упрощает управление дизайном сайта без доступа к админке
  • Позволяет создавать мультисайты с разными дизайнами на одном движке
  • Улучшают пользовательский опыт за счет мгновенной смены стиля

Реализовать это можно через создание кастомной страницы настроек в админке, где будет переключатель тем, и применение хука template и stylesheet, чтобы WordPress подгружал выбранную тему.

Создаем страницу настроек с переключателем тем

Для начала зарегистрируем страницу настроек в меню и добавим поле переключателя. Для примера возьмем две темы: twentytwentyone и twentytwentytwo.

function wpdevelop_register_theme_switcher_page() {
    add_menu_page(
        'Переключатель темы',
        'Тема сайта',
        'manage_options',
        'wpdevelop-theme-switcher',
        'wpdevelop_render_theme_switcher_page'
    );
}
add_action('admin_menu', 'wpdevelop_register_theme_switcher_page');

function wpdevelop_render_theme_switcher_page() {
    if (!current_user_can('manage_options')) {
        return;
    }
    if (isset($_POST['wpdevelop_theme'])) {
        check_admin_referer('wpdevelop_theme_switcher_nonce');
        $theme = sanitize_text_field($_POST['wpdevelop_theme']);
        update_option('wpdevelop_active_theme', $theme);
        echo '<div class="updated"><p>Тема сменена на '.esc_html($theme).'</p></div>';
    }
    $active_theme = get_option('wpdevelop_active_theme', wp_get_theme()->get_stylesheet());
    ?>
    <div class="wrap">
        <h1>Переключатель темы</h1>
        <form method="post">
            <?php wp_nonce_field('wpdevelop_theme_switcher_nonce'); ?>
            <label for="wpdevelop_theme">Выберите тему:</label>
            <select name="wpdevelop_theme" id="wpdevelop_theme">
                <option value="twentytwentyone" <?php selected($active_theme, 'twentytwentyone'); ?>>Twenty Twenty-One</option>
                <option value="twentytwentytwo" <?php selected($active_theme, 'twentytwentytwo'); ?>>Twenty Twenty-Two</option>
            </select>
            <input type="submit" value="Сохранить" class="button button-primary" />
        </form>
    </div>
    <?php
}

Этот код добавляет страницу в админку, где администратор может выбрать одну из двух тем.

Применяем выбранную тему через хуки template и stylesheet

Теперь нужно, чтобы WordPress использовал выбранную тему при загрузке сайта. Для этого применим фильтры template и stylesheet, возвращая выбранное значение.

function wpdevelop_set_active_theme_template($template) {
    $active_theme = get_option('wpdevelop_active_theme');
    if ($active_theme) {
        // Проверяем, что такая тема установлена
        $theme = wp_get_theme($active_theme);
        if ($theme->exists()) {
            return $active_theme;
        }
    }
    return $template;
}

add_filter('template', 'wpdevelop_set_active_theme_template');
add_filter('stylesheet', 'wpdevelop_set_active_theme_template');

Так мы динамически подменяем тему WordPress на ту, что указана в настройках.

Улучшения и безопасность

Важно убедиться, что выбранная тема действительно существует, чтобы не сломать сайт. В нашем примере это сделано через $theme->exists(). Также используйте проверки прав доступа и nonce, как в примере выше.

Для удобства можно расширить список тем, автоматически собирая все доступные темы:

function wpdevelop_get_available_themes() {
    $themes = wp_get_themes();
    $result = [];
    foreach ($themes as $slug => $theme) {
        $result[$slug] = $theme->get('Name');
    }
    return $result;
}

И использовать результат для генерации <select> динамически.

Пример использования с плагином Clearfy Pro

Если вы используете плагин Clearfy Pro, то он содержит множество оптимизаций и может помочь в управлении кэшированием и очисткой, что важно при смене темы, чтобы изменения отображались сразу без задержек.

Заключение

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

WooCommerce: автоматическое удаление заказов по статусу и дате
09.07.2026
Автоматическое удаление товаров из WooCommerce при пустой корзине
12.05.2026
Как добавить поддержку Gutenberg блоков в своем плагине WordPress
22.03.2026
Как создать динамический файл robots.txt в WordPress
08.03.2026
Как создать автоматический импорт пользователей из CSV в WordPress
19.03.2026