В WordPress темы часто требуют гибкости в управлении стилями — например, изменение цвета фона, шрифтов или других параметров в зависимости от настроек пользователя или контекста страницы. Статичные CSS-файлы не всегда подходят, особенно если вы хотите дать пользователю возможность менять внешний вид сайта без правки кода.
Зачем нужны динамические стили в теме WordPress
Динамические стили позволяют адаптировать внешний вид сайта под нужды пользователя или администратора без необходимости вручную редактировать CSS-файлы. Это особенно полезно, если вы создаёте кастомную тему или разрабатываете тему под клиента, где важно предоставить максимум возможностей для настройки.
Например, можно позволить менять цвет кнопок из админ-панели, цвет фона хедера или размер шрифта в теле статьи. Всё это проще и удобнее сделать через динамические стили, которые генерируются на лету в зависимости от настроек.
Кроме того, динамические стили помогают оптимизировать загрузку — вы подключаете только нужные стили и избегаете избыточных классов и правил.
Как реализовать динамические стили в теме WordPress
Для генерации динамических стилей есть несколько способов. Основные из них:
- Добавлять inline стили через хук
wp_head - Подключать дополнительный CSS-файл с помощью
wp_add_inline_style - Использовать кастомные настройки темы из Customizer API и генерировать CSS на основе этих настроек
Рассмотрим каждый из них подробнее.
1. Генерация inline стилей через wp_head
Самый простой способ — вешать функцию на хук wp_head и выводить CSS прямо в <head>. Например, если у вас есть опция цвета из настроек темы:
function wp_theme_ru_dynamic_styles() {
$button_color = get_theme_mod('wp_theme_ru_button_color', '#ff0000');
echo "<style>
.btn-primary { background-color: " . esc_attr($button_color) . "; }
</style>";
}
add_action('wp_head', 'wp_theme_ru_dynamic_styles');
Такой подход прост, но не самый оптимальный — стили не кэшируются отдельно и всегда выводятся в HTML страницы.
2. Добавление CSS через wp_add_inline_style
Лучше зарегистрировать базовый CSS-файл и добавить к нему динамические стили через wp_add_inline_style. Это позволяет браузеру кэшировать основной файл, а динамические стили подключаются поверх.
Пример:
function wp_theme_ru_enqueue_scripts() {
wp_enqueue_style('wp_theme_ru-style', get_template_directory_uri() . '/style.css');
$button_color = get_theme_mod('wp_theme_ru_button_color', '#ff0000');
$custom_css = ".btn-primary { background-color: " . esc_attr($button_color) . "; }";
wp_add_inline_style('wp_theme_ru-style', $custom_css);
}
add_action('wp_enqueue_scripts', 'wp_theme_ru_enqueue_scripts');
Такой способ более оптимальный и рекомендован к применению.
3. Использование Customizer API для управления стилями
Чтобы дать пользователям возможность изменять стили через панель настройки темы, используйте Customizer API. Создайте настройки и контролы, чтобы пользователь мог выбрать цвет, размер шрифта и др. Затем динамически выводите стили на основе этих значений.
Вот пример добавления настройки цвета кнопки в functions.php:
function wp_theme_ru_customize_register($wp_customize) {
$wp_customize->add_setting('wp_theme_ru_button_color', [
'default' => '#ff0000',
'sanitize_callback' => 'sanitize_hex_color',
]);
$wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, 'wp_theme_ru_button_color_control', [
'label' => 'Цвет кнопки',
'section' => 'colors',
'settings' => 'wp_theme_ru_button_color',
]));
}
add_action('customize_register', 'wp_theme_ru_customize_register');
Далее этот параметр используйте в функциях подключения стилей, как показано выше.
Пример комплексной реализации динамических стилей
Соберём простой пример, где динамически меняется цвет кнопок и фон шапки сайта.
В functions.php добавим настройки:
function wp_theme_ru_customize_register($wp_customize) {
$wp_customize->add_setting('wp_theme_ru_button_color', [
'default' => '#0073aa',
'sanitize_callback' => 'sanitize_hex_color',
]);
$wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, 'wp_theme_ru_button_color_control', [
'label' => 'Цвет кнопки',
'section' => 'colors',
'settings' => 'wp_theme_ru_button_color',
]));
$wp_customize->add_setting('wp_theme_ru_header_bg', [
'default' => '#ffffff',
'sanitize_callback' => 'sanitize_hex_color',
]);
$wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, 'wp_theme_ru_header_bg_control', [
'label' => 'Фон шапки',
'section' => 'colors',
'settings' => 'wp_theme_ru_header_bg',
]));
}
add_action('customize_register', 'wp_theme_ru_customize_register');
Подключение стилей:
function wp_theme_ru_enqueue_scripts() {
wp_enqueue_style('wp_theme_ru-style', get_template_directory_uri() . '/style.css');
$button_color = get_theme_mod('wp_theme_ru_button_color', '#0073aa');
$header_bg = get_theme_mod('wp_theme_ru_header_bg', '#ffffff');
$custom_css = ".btn-primary { background-color: " . esc_attr($button_color) . "; }
header.site-header { background-color: " . esc_attr($header_bg) . "; }";
wp_add_inline_style('wp_theme_ru-style', $custom_css);
}
add_action('wp_enqueue_scripts', 'wp_theme_ru_enqueue_scripts');
Полезные плагины для работы с динамическими стилями
Если вы хотите расширить возможности кастомизации без глубокого кодинга, рекомендуем обратить внимание на плагины:
- Clearfy Pro — оптимизация и расширение настройки сайта, включая визуальные настройки.
- WPStories — для добавления интерактивного контента с гибкой стилевой настройкой.
Использование таких плагинов может существенно упростить задачу добавления динамических стилей и кастомизации темы без глубоких знаний CSS и PHP.
Советы по оптимизации динамических стилей
1. Минимизируйте объем динамического CSS, чтобы не замедлять загрузку страницы.
2. Используйте wp_add_inline_style вместо wp_head для лучшей интеграции и кэширования.
3. Старайтесь кешировать результаты вычислений, если стили зависят от сложных условий.
4. Валидируйте и экранируйте все пользовательские данные, чтобы избежать уязвимостей.
Динамические стили — мощный инструмент для создания гибких и настраиваемых тем. Используйте описанные способы, чтобы ваша тема была удобна для конечного пользователя и хорошо оптимизирована.