Inyectar CSS en línea desde functions.php en WordPress
Estoy intentando inyectar un estilo CSS en línea al elemento body a través del archivo functions.php. Necesita ser en línea porque estoy usando ACF para permitir que el usuario cambie la imagen.
Este debería ser el resultado:
<body style="background-image: url('<?php the_field('background'); ?>');">
Leí sobre wp add inline style, pero no pude hacerlo funcionar.
Actualización: Aquí está la función que intenté:
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' );
Cargué un archivo body.css para intentar agregar el CSS en línea. Pero no funcionó - ¿quizás este no sea el enfoque correcto?

La forma más fácil que he visto es usar echo
donde lo necesites:
function inline_css() {
echo "<style>html{background-color:#001337}</style>";
}
add_action( 'wp_head', 'inline_css', 0 );
Desde 2019 también puedes agregar estilos en línea dentro del body
, mostrado aquí sin usar echo
:
function example_body_open () { ?>
<style>
html {
background-color: #B4D455;
}
</style>
<?php }
add_action( 'wp_body_open', 'example_body_open' );
El beneficio aquí es que obtienes mejor resaltado de sintaxis y no necesitas escapar comillas dobles. Ten en cuenta que este hook en particular solo funcionará con temas que implementen el wp_body_open
hook.

Los estilos en línea son estilos que se escriben directamente en la etiqueta del documento y esto es lo que estás buscando.
Pero, wp_add_inline_style
agregará una pieza adicional de CSS en la sección <head>
del documento (estilo embebido), no al atributo style de HTML.
Así que, si deseas colocar tu valor CSS directamente en el marcado HTML mediante un atributo style, entonces wp_add_inline_style
no hará eso por ti. Deberías pasar el valor de get_field
a un atributo style en tus archivos de plantilla, o considerar usar JavaScript.
<div style="<?php the_field( 'some-field' ) ?>">
</div>

¿Quizás este no sea el enfoque correcto en absoluto?
wp_add_inline_style agrega estilos CSS adicionales a una hoja de estilos registrada. Esta función no agregará un estilo html inline a la etiqueta body.
Sin embargo, sí creo que este es el enfoque correcto para el problema. Básicamente lo estás haciendo bien, pero necesitas agregar tanto CSS inline como otra clase al body para que el CSS realmente haga efecto.
/**
* Agregar condicionalmente clase al body y CSS inline
*/
//* Agregar acción a wp_loaded para inicializar el plugin
add_action( 'wp_loaded', 'wpse_106269_wp_loaded' );
function wpse_106269_wp_loaded() {
add_action( 'wp_enqueue_scripts', 'wpse_106269_enqueue_scripts' );
//* Agregar hooks condicionalmente
if( '' !== get_theme_mod( 'my-mod', '' ) ) {
add_filter( 'body_class', 'wpse_106269_body_class' );
add_action( 'wp_enqueue_scripts', 'wpse_106269_add_inline_style' );
}
}
//* Asegurarse de cargar el CSS personalizado
function wpse_106269_enqueue_scripts() {
wp_enqueue_style( 'custom-style', '/style.css' );
}
//* Agregar otra clase a la etiqueta body
function wpse_106269_body_class( $classes ) {
$classes[] = 'custom-background-image';
return $classes;
}
//* Agregar background-image inline
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 );
}
