Come aggiungere opzioni CSS al mio plugin senza utilizzare stili inline?
Ho recentemente rilasciato un plugin, WP Coda Slider, che utilizza shortcode per aggiungere uno slider jQuery a qualsiasi articolo o pagina. Sto aggiungendo una pagina di opzioni nella prossima versione e vorrei includere alcune opzioni CSS ma non voglio che il plugin aggiunga le scelte di stile come CSS inline. Voglio che le scelte vengano aggiunte dinamicamente al file CSS quando viene richiamato.
Vorrei anche evitare di utilizzare fopen o di scrivere su file per problemi di sicurezza.
È facile realizzare qualcosa del genere o sarebbe meglio aggiungere semplicemente le scelte di stile direttamente alla pagina?

Utilizza wp_register_style
e wp_enqueue_style
per aggiungere il foglio di stile. NON aggiungere semplicemente un link al foglio di stile in wp_head
. Accodare gli stili permette ad altri plugin o temi di modificare il foglio di stile se necessario.
Il tuo foglio di stile può essere un file .php:
wp_register_style('myStyleSheet', 'my-stylesheet.php');
wp_enqueue_style( 'myStyleSheet');
my-stylesheet.php apparirà così:
<?php
// Stiamo per emettere CSS
header('Content-type: text/css');
include('my-plugin-data.php');
?>
body {
background: <?php echo $my_background_variable; ?>;
font-size: <?php echo $my_font_size; ?>;
}

Inoltre - dato che i valori cambiano solo quando vengono modificati nella pagina delle opzioni - potresti generare il file CSS al momento del salvataggio. Puoi archiviare i file CSS anche nella directory del plugin, quindi è un po' più performante rispetto all'esecuzione di un file PHP per ogni richiesta CSS con include ecc.

Grazie! Ha funzionato bene. Ma ho ricevuto l'errore fatale get_option()... non è definita. Poi ho caricato il file wp-config.php e ho risolto il problema.

Creare dinamicamente un file CSS e poi caricarlo aggiunge un ENORME carico prestazionale a quello che dovrebbe essere un'operazione a basso consumo di banda come l'aggiunta di un file CSS, specialmente se ci sono variabili nel CSS che devono essere elaborate attraverso WP. Poiché vengono creati due file diversi per un singolo caricamento di pagina, WP si avvia due volte ed esegue tutte le query al database due volte, creando un gran pasticcio.
Se il tuo slider sarà presente solo in una pagina e vuoi impostare gli stili dinamicamente, la soluzione migliore è aggiungere un blocco di stile nell'header.
In ordine di prestazioni:
- Aggiungi un piccolo blocco di stili nell'header, creato dinamicamente - Molto veloce
- Aggiungi un foglio di stile non dinamico via wp_enqueue_style - Medio
- Aggiungi un foglio di stile dinamico via wp_enqueue_style - Molto lento

@Dan-gayle Ottimo punto. Il plugin può essere utilizzato su più di una pagina e alcuni utenti lo usano su 2 o 3 pagine. Includerà solo il foglio di stile statico corrente e il js nelle pagine che contengono lo shortcode.

Concordo con Dan Gayle, anche se hai votato positivamente la mia risposta. Aggiungere un piccolo blocco CSS a wp_head sarebbe molto meglio in termini di prestazioni rispetto al richiedere il download di un foglio di stile separato ad ogni visualizzazione di pagina (anche se limitato ai pochi post/pagine con lo shortcode). L'unica ragione per utilizzare fogli di stile separati è che possono essere messi in cache dal browser. I fogli di stile dinamici non possono essere memorizzati nella cache.

Ecco come lo faccio solitamente:
function build_stylesheet_url() {
echo '<link rel="stylesheet" href="' . $url . 'stylesheetname.css?build=' . date( "Ymd", strtotime( '-24 days' ) ) . '" type="text/css" media="screen" />';
}
function build_stylesheet_content() {
if( isset( $_GET['build'] ) && addslashes( $_GET['build'] ) == date( "Ymd", strtotime( '-24 days' ) ) ) {
header("Content-type: text/css");
echo "/* Qualcosa */";
define( 'DONOTCACHEPAGE', 1 ); // impedisce a wp-super-cache di memorizzare questa pagina
die();
}
}
add_action( 'init', 'build_stylesheet_content' );
add_action( 'wp_head', 'build_stylesheet_url' );

Ho avuto difficoltà con tutte le raccomandazioni di questo tipo - forse sono un po' tardo, o forse i contributori hanno perso il contatto con la realtà.
Alla fine ho optato per codificare questo nel file php del plugin:-
echo "<link href='http://www.brittany-gite-holidays.co.uk/wp-content/plugins/flexavailability/css/css.css' type='text/css' rel='stylesheet' />";
echo "<link href='http://www.brittany-gite-holidays.co.uk/wp-content/plugins/flexavailability/css/public.css' rel='stylesheet' type='text/css'/>";
Sembra funzionare. Carica solo nelle pagine che utilizzano il plugin. Si carica dopo il tag h1 che per me va bene. Non vedo come potrebbe essere più efficiente o più chiaro.
...ma forse mi sbaglio - ho detto che sono un po' tardo.

Sì. Questo perché il tuo CSS è pensato per influenzare tutto dalla parte superiore della pagina verso il basso. A me va bene influenzare solo ciò che viene dopo il tag h1. Non sono riuscito a far funzionare nessuno degli esempi (penso che possano essere spiegati male). Provalo tu stesso su un pezzo di HTML di test. Se sbaglio dimmelo :)

@chazza Non è l'unico motivo. Quando un browser rileva degli stili dopo che il tag body è stato scritto, interrompe tutto ciò che sta facendo finché quello stile non viene caricato e applicato, il che è negativo per le prestazioni e porta a riflussi dello schermo e flash di testo non stilizzato.
Tuttavia, se non ha molta importanza, inserisci pure quei file CSS come hai detto. Lo faccio spesso anch'io e alla fine va bene. Non ottimale, ma accettabile.

Aggiornamento da WordPress 3.3
È disponibile una funzione chiamata wp_add_inline_style che può essere utilizzata per aggiungere dinamicamente stili in base alle opzioni del tema/plugin. Questo può essere usato per aggiungere un piccolo file CSS nell'head che dovrebbe essere veloce ed efficiente.
<?php
function myprefix_scripts() {
wp_enqueue_style('name-of-style-css', plugin_dir_path(__FILE__) . '/css/ccsfilename.css');
$css = get_option( 'loader_css', 'valore CSS predefinito se non è presente alcun valore' );
//Oppure per esempio
$color = get_option( 'custom_plugin_color', 'red' ); //red è il valore predefinito se non è impostato
$css = ".mycolor{
background: {$color};
}";
wp_add_inline_style('name-of-style-css', $css);
}
add_action( 'wp_enqueue_scripts', 'myprefix_scripts' );
