Добавление inline CSS через functions.php
Я пытаюсь добавить inline CSS стили к элементу body через файл functions.php. Стили должны быть inline, потому что я использую ACF, чтобы позволить пользователю изменять изображение.
Ожидаемый результат:
<body style="background-image: url('<?php the_field('background'); ?>');">
Я читал о wp_add_inline_style, но не смог разобраться.
Обновление: Вот функция, которую я пробовал:
function wpdocs_styles_method() {
wp_enqueue_style('custom-style', get_stylesheet_directory_uri() . '/body.css'
);
$img = get_theme_mod( "<?php the_field('background') ?>" );
$custom_css = "body {background-image: {$img}";
wp_add_inline_style( 'custom-style', $custom_css );
}
add_action( 'wp_enqueue_scripts', 'wpdocs_styles_method' );
Я загрузил body.css и попытался добавить inline CSS. Но это не сработало - возможно, это вообще неправильный подход?

Самый простой способ, который я видел — это вывести стили через echo
там, где они нужны:
function inline_css() {
echo "<style>html{background-color:#001337}</style>";
}
add_action( 'wp_head', 'inline_css', 0 );
Начиная с 2019 года, стили можно добавлять непосредственно внутри тега body
, как показано ниже (без использования echo
):
function example_body_open () { ?>
<style>
html {
background-color: #B4D455;
}
</style>
<?php }
add_action( 'wp_body_open', 'example_body_open' );
Преимущество этого подхода — лучшая подсветка синтаксиса и отсутствие необходимости экранировать двойные кавычки. Обратите внимание, что этот хук будет работать только в темах, поддерживающих хук wp_body_open
.

Встроенные стили — это стили, которые записываются непосредственно в тег документа, и это именно то, что вам нужно.
Однако, функция wp_add_inline_style
добавит дополнительный кусок CSS в секцию <head>
документа (встроенный стиль), а не в HTML-тег style.
Таким образом, если вам нужно разместить ваше CSS-значение непосредственно в HTML-разметке через тег style, то wp_add_inline_style
не подойдет для этой задачи. Вам следует либо передать значение get_field
в HTML-тег style в ваших файлах шаблонов, либо рассмотреть использование JavaScript.
<div style="<?php the_field( 'some-field' ) ?>">
</div>

может быть, это вообще неправильный подход?
wp_add_inline_style добавляет дополнительные CSS-стили к зарегистрированной таблице стилей. Эта функция не добавляет встроенный HTML-стиль к тегу body.
Однако я действительно считаю, что это правильный подход к решению проблемы. Вы в основном делаете всё верно, но вам нужно добавить как встроенный CSS, так и дополнительный класс к тегу body, чтобы CSS действительно сработал.
/**
* Условное добавление класса к body и встроенного CSS
*/
//* Добавляем действие к wp_loaded для инициализации плагина
add_action( 'wp_loaded', 'wpse_106269_wp_loaded' );
function wpse_106269_wp_loaded() {
add_action( 'wp_enqueue_scripts', 'wpse_106269_enqueue_scripts' );
//* Условное добавление хуков
if( '' !== get_theme_mod( 'my-mod', '' ) ) {
add_filter( 'body_class', 'wpse_106269_body_class' );
add_action( 'wp_enqueue_scripts', 'wpse_106269_add_inline_style' );
}
}
//* Убедимся, что загружается наш кастомный CSS
function wpse_106269_enqueue_scripts() {
wp_enqueue_style( 'custom-style', '/style.css' );
}
//* Добавляем дополнительный класс к тегу body
function wpse_106269_body_class( $classes ) {
$classes[] = 'custom-background-image';
return $classes;
}
//* Добавляем встроенный background-image
function wpse_106269_add_inline_style() {
$background_url = esc_url( get_theme_mod( 'my-mod', '' ) );
$custom_css = ".custom-background-image { background-image:URL( $background_url ); }";
wp_add_inline_style( 'custom-style', $custom_css );
}
