Come faccio ad aggiungere opzioni CSS al mio plugin senza usare gli stili in linea?


26

Di recente ho rilasciato un plugin, WP Coda Slider , che utilizza codici brevi per aggiungere un cursore jQuery a qualsiasi post 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 incorporato. Voglio che le scelte vengano aggiunte dinamicamente al file CSS quando viene chiamato.

Vorrei anche evitare di usare fopen o scrivere su un file per problemi di sicurezza.

Qualcosa del genere è facile da realizzare o starei meglio aggiungendo le scelte di stile direttamente alla pagina?


@Chris_O : ho pensato quasi esattamente alla stessa cosa. Quello che voglio è un modo per chiamare wp_enqueue_style()(e wp_enqueue_script()) con un nome di funzione anziché un nome di file e fare in modo che la mia funzione generi il CSS (o JS), ma alla fine sia ancora inclusa tramite un foglio di stile collegato. Per quanto ne so, questo non è possibile con le wp_equeue_*()funzioni. Forse dovremmo inviare un biglietto trac?
MikeSchinkel,

@MikeSchinkel: sarebbe un modo molto logico di usare le funzioni wp_enqueue. Vorrei aggiungere supporto a quel ticket.
Chris_O,

@Chris_O: ho appena visto la risposta di @ Doug; Ho fatto una brutta supposizione che tu lo sapessi già. Se avessi capito che non era il caso che ti avrei indicato qui: wordpress.stackexchange.com/questions/556/#562
MikeSchinkel

@MikeSchinkel Conoscevo wp_register e wp_enqueue. Stavo cercando un modo per costruire il foglio di stile basato sui valori dalla pagina delle opzioni del plugin.
Chris_O,

@Chris_O : Ah. Mi piace pensare a me stesso come a qualcuno che può ancora vedere ciò che gli altri mancano in una soluzione anche dopo aver appreso la soluzione (vale a dire che la maggior parte degli esperti non sono buoni insegnanti e anche se non sono il miglior esperto in genere sono un buon insegnante. ) OTOH, questo è uno che mi è mancato, scusa. :)
MikeSchinkel,

Risposte:


27

Utilizzare wp_register_stylee wp_enqueue_styleper aggiungere il foglio di stile. NON aggiungere semplicemente un collegamento al foglio di stile a wp_head. Gli stili di accodamento consentono ad altri plugin o temi di modificare il foglio di stile, se necessario.

Il foglio di stile può essere un file .php:

wp_register_style('myStyleSheet', 'my-stylesheet.php');
wp_enqueue_style( 'myStyleSheet');

my-stylesheet.php sarebbe simile a questo:

<?php
// We'll be outputting 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; ?>;
}

3
Inoltre, poiché i valori cambiano solo quando vengono modificati i valori nella pagina delle opzioni, è possibile generare il file CSS al momento del salvataggio. Puoi anche archiviare i file CSS nella directory dei plugin, quindi è un po 'più performante di eseguire un file PHP su ogni richiesta CSS con include ecc.
Hacre,

1
Grazie! ha funzionato bene. Ma ho avuto l'errore fatale get_option () ... non è definito. Quindi ho caricato il file wp-config.php e poi risolto il problema.
Sumith Harshan,

Sumith, potresti spiegare come hai usato get_option all'interno del file CSS personalizzato? Grazie molto!
Antonio Petricca,

10

La creazione dinamica di un file CSS e il suo caricamento aggiunge un enorme onere di prestazioni a quella che dovrebbe essere una quantità di larghezza di banda molto bassa di aggiunta di un file CSS, specialmente se ci sono variabili nel CSS che verranno elaborate tramite WP. Poiché sono stati creati due file diversi per un caricamento di pagina, WP si avvia due volte ed esegue tutte le query DB due volte, ed è un gran casino.

Se il tuo dispositivo di scorrimento si troverà su una sola pagina e desideri che gli stili siano impostati in modo dinamico, la soluzione migliore è aggiungere un blocco di stile all'intestazione.

In ordine di prestazione:

  1. Aggiungi un piccolo blocco di stili nell'intestazione, creato dinamicamente - Molto velocemente
  2. Aggiungi un foglio di stile non dinamico tramite wp_enqueue_style - Medio
  3. Aggiungi un foglio di stile dinamico tramite wp_enqueue_style - Molto lento

@ Dan-gayle Ottimo punto. Il plug-in può essere utilizzato su più di una pagina e alcuni utenti lo utilizzano su 2 o 3 pagine. Accoda solo il foglio di stile statico corrente e js sulle pagine che hanno lo shortcode.
Chris_O,

Sono d'accordo con Dan Gayle, anche se hai votato a favore della mia risposta. L'aggiunta di un piccolo blocco CSS a wp_head sarebbe molto migliore dal punto di vista delle prestazioni rispetto alla necessità di scaricare un foglio di stile separato su ogni visualizzazione di pagina (anche se limitato ai pochi post / pagine con lo shortcode). L'unico motivo per utilizzare fogli di stile separati in primo luogo è che possono essere memorizzati nella cache dal browser . I fogli di stile dinamici non possono essere memorizzati nella cache.
Doug,

2
È ancora il modo giusto di affrontare le cose?
Dave Kiss,

2

Ecco come lo faccio di solito:

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 "/* Something */";
        define( 'DONOTCACHEPAGE', 1 ); // don't let wp-super-cache cache this page.
        die();
    }
}

add_action( 'init', 'build_stylesheet_content' );
add_action( 'wp_head', 'build_stylesheet_url' );

1

Ho avuto difficoltà con tutte le raccomandazioni di questo genere - forse sono un po 'spessa, o forse i collaboratori hanno perso il tocco comune.

Ho deciso di codificare questo nel file php plug-in: -

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 Si carica solo su quelle pagine che utilizzano il plugin. Si carica dopo il tag h1 che va bene per me. Non riesco a vedere come potrebbe essere più efficiente o più chiaro.

.... ma forse mi sbaglio - ho detto che ero un po 'spessa.


Dovresti solo caricare <link>elementi nell'intestazione della pagina
shea

Yerss. Ciò sarebbe dovuto al fatto che il tuo CSS vuole influenzare tutto dalla parte superiore della pagina verso il basso. Sono felice di influenzare solo ciò che viene dopo il tag h1. Non ho potuto far funzionare nessuno degli esempi (penso che possano essere spiegati male). Provalo tu stesso su un pezzo di test HTML. Se sbaglio, dimmelo :)
Chazza,

@chazza Non è l'unica ragione. Quando un browser rileva uno stile dopo che il tag body è stato scritto, interrompe qualsiasi altra cosa stia facendo fino a quando lo stile non viene caricato e applicato, il che è negativo per le prestazioni e porta a ridisposizione dello schermo e lampi di testo non modificato. Tuttavia, se non importa, lancia quei file CSS come hai detto. Lo faccio sempre, e alla fine va bene. Non ottimale, ma va bene.
Dan Gayle,

0

Aggiornamento da Wordpress 3.3

Esiste una funzione chiamata wp_add_inline_style che può essere utilizzata per aggiungere dinamicamente stili in base alle opzioni di temi / plugin. Questo può essere usato per aggiungere un piccolo file CSS nella testa 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', 'default css goes here for when there is no value' );

    //or for Example
    $color = get_option( 'custom_plugin_color', 'red' ); //red is default value if value is not set
    $css = ".mycolor{
                background: {$color};
           }";

    wp_add_inline_style('name-of-style-css', $css);

}

add_action( 'wp_enqueue_scripts', 'myprefix_scripts' );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.