Iniettare CSS inline in functions.php
Sto cercando di iniettare uno stile CSS inline nell'elemento body tramite il file functions.php. Deve essere inline perché sto usando ACF per permettere all'utente di cambiare l'immagine.
Questo dovrebbe essere il risultato:
<body style="background-image: url('<?php the_field('background'); ?>');">
Ho letto riguardo wp add inline style, ma non sono riuscito a capire come implementarlo.
Aggiornamento: Ecco la funzione che ho provato:
function wpdocs_styles_method() {
// Carica il foglio di stile
wp_enqueue_style('custom-style', get_stylesheet_directory_uri() . '/body.css');
// Ottiene l'immagine dal campo ACF
$img = get_theme_mod( "<?php the_field('background') ?>" );
// Crea il CSS personalizzato
$custom_css = "body {background-image: {$img}";
// Aggiunge lo stile inline
wp_add_inline_style( 'custom-style', $custom_css );
}
add_action( 'wp_enqueue_scripts', 'wpdocs_styles_method' );
Ho caricato un file body.css per provare ad aggiungere il CSS inline. Ma non ha funzionato - forse questo non è l'approccio corretto?

Il modo più semplice che ho visto è usare echo
dove ti serve:
function inline_css() {
echo "<style>html{background-color:#001337}</style>";
}
add_action( 'wp_head', 'inline_css', 0 );
Dal 2019 puoi anche aggiungere stili inline all'interno del body
, come mostrato qui senza usare echo
:
function example_body_open () { ?>
<style>
html {
background-color: #B4D455;
}
</style>
<?php }
add_action( 'wp_body_open', 'example_body_open' );
Il vantaggio qui è che ottieni un migliore syntax highlighting e non devi eseguire l'escape delle virgolette doppie. Nota che questo particolare hook funzionerà solo con temi che implementano l'wp_body_open
hook.

Gli stili inline sono stili che vengono scritti direttamente nel tag del documento e questo è ciò che stai cercando.
Tuttavia, wp_add_inline_style
aggiungerà un pezzo extra di CSS nella sezione <head>
del documento (stile incorporato), non al tag style HTML.
Quindi, se desideri inserire il tuo valore CSS direttamente nel markup HTML tramite un tag style, allora wp_add_inline_style
non farà questo per te. Dovresti passare il valore di get_field
a un tag style HTML nei tuoi file template, oppure considerare l'uso di JavaScript.
<div style="<?php the_field( 'some-field' ) ?>">
</div>

forse questo non è l'approccio giusto?
wp_add_inline_style aggiunge stili CSS extra a un foglio di stile registrato. Questa funzione non aggiunge uno stile inline html al tag body.
Tuttavia, penso che questo sia l'approccio corretto al problema. Stai fondamentalmente facendo la cosa giusta, ma devi aggiungere sia il css inline che un'altra classe al body affinché il css abbia effetto.
/**
* Aggiunge condizionalmente una classe al body e css inline
*/
//* Aggiunge l'azione a wp_loaded per inizializzare il plugin
add_action( 'wp_loaded', 'wpse_106269_wp_loaded' );
function wpse_106269_wp_loaded() {
add_action( 'wp_enqueue_scripts', 'wpse_106269_enqueue_scripts' );
//* Aggiunge hook condizionalmente
if( '' !== get_theme_mod( 'my-mod', '' ) ) {
add_filter( 'body_class', 'wpse_106269_body_class' );
add_action( 'wp_enqueue_scripts', 'wpse_106269_add_inline_style' );
}
}
//* Assicura che carichiamo il css personalizzato.
function wpse_106269_enqueue_scripts() {
wp_enqueue_style( 'custom-style', '/style.css' );
}
//* Aggiunge un'altra classe al tag body.
function wpse_106269_body_class( $classes ) {
$classes[] = 'custom-background-image';
return $classes;
}
//* Aggiunge 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 );
}
