Comment ajouter des options CSS à mon plugin sans utiliser de styles en ligne?


26

J'ai récemment publié un plugin, WP Coda Slider , qui utilise des shortcodes pour ajouter un curseur jQuery à n'importe quelle publication ou page. J'ajoute une page d'options dans la prochaine version et je voudrais inclure quelques options CSS mais je ne veux pas que le plugin ajoute les choix de style en CSS en ligne. Je veux que les choix soient ajoutés dynamiquement au fichier CSS lors de son appel.

Je voudrais également éviter d'utiliser fopen ou d'écrire dans un fichier pour des problèmes de sécurité.

Est-ce que quelque chose comme ça est facile à réaliser ou serais-je mieux de simplement ajouter les choix de style directement à la page?


@Chris_O : J'ai pensé presque exactement à la même chose. Ce que je veux, c'est un moyen d'appeler wp_enqueue_style()(et wp_enqueue_script()) avec un nom de fonction au lieu d'un nom de fichier et que ma fonction génère le CSS (ou JS) mais qu'il soit finalement inclus via une feuille de style liée. Pour autant que je sache, ce n'est pas possible avec les wp_equeue_*()fonctions. Peut-être devrions-nous soumettre un ticket Trac?
MikeSchinkel

@MikeSchinkel: Ce serait une manière très logique d'utiliser les fonctions wp_enqueue. J'ajouterais le support à ce ticket.
Chris_O

@Chris_O: Je viens de voir la réponse de @ Doug; J'ai fait une mauvaise supposition que vous le saviez déjà. Si j'avais réalisé que ce n'était pas le cas, je vous aurais signalé ici: wordpress.stackexchange.com/questions/556/#562
MikeSchinkel

@MikeSchinkel Je connaissais wp_register et wp_enqueue. Je cherchais un moyen de construire la feuille de style en fonction des valeurs de la page d'options du plugin.
Chris_O

@Chris_O : Ah. J'aime me considérer comme quelqu'un qui peut encore voir ce que d'autres manquent dans une solution même après avoir appris la solution (c'est-à-dire que la plupart des experts ne sont pas de bons enseignants et bien que je ne sois pas le meilleur expert, je suis généralement un bon enseignant. ) OTOH, c'est celui qui m'a manqué, désolé. :)
MikeSchinkel

Réponses:


27

Utilisez wp_register_styleet wp_enqueue_stylepour ajouter la feuille de style. N'ajoutez PAS simplement un lien vers une feuille de style wp_head. Les styles de file d'attente permettent à d'autres plugins ou thèmes de modifier la feuille de style si nécessaire.

Votre feuille de style peut être un fichier .php:

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

my-stylesheet.php ressemblerait à ceci:

<?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
De plus - comme les valeurs ne changent que lorsque les valeurs de la page d'options sont modifiées - vous pouvez générer le fichier CSS lors de l'enregistrement. Vous pouvez également stocker des fichiers CSS dans le répertoire du plugin, c'est donc un peu plus performant que d'exécuter un fichier PHP sur chaque demande CSS avec des inclus etc.
hakre

1
Merci! a bien fonctionné. Mais j'ai eu l'erreur fatale get_option () ... n'est pas définie. Ensuite, j'ai chargé le fichier wp-config.php, puis j'ai résolu le problème.
Sumith Harshan

Sumith, pourriez-vous expliquer comment vous avez utilisé l'option get_option dans le fichier CSS personnalisé? Merci beaucoup!
Antonio Petricca

10

La création dynamique d'un fichier CSS, puis son chargement ajoute une énorme charge de performances à ce qui devrait être une très faible bande passante d'ajout d'un fichier CSS, surtout s'il y a des variables dans le CSS qui vont être traitées via WP. Parce qu'il s'agit de deux fichiers différents en cours de création pour un chargement de page, WP démarre deux fois et exécute toutes les requêtes DB deux fois, et c'est un gros gâchis.

Si votre curseur ne se trouve que sur une seule page et que vous souhaitez que les styles soient définis dynamiquement, alors votre meilleur pari est d'ajouter un bloc de style à l'en-tête.

Par ordre de performance:

  1. Ajouter un petit bloc de styles dans l'en-tête, créé dynamiquement - Très rapide
  2. Ajouter une feuille de style non dynamique via wp_enqueue_style - Medium
  3. Ajouter une feuille de style dynamique via wp_enqueue_style - Très lent

@ Dan-gayle Très bon point. Le plugin peut être utilisé sur plusieurs pages et certains utilisateurs l'utilisent sur 2 ou 3 pages. Il ne met en file d'attente la feuille de style statique actuelle et js sur les pages qui ont le shortcode.
Chris_O

Je suis d'accord avec Dan Gayle, même si vous avez voté ma réponse. Ajouter un petit bloc CSS à wp_head serait bien mieux en termes de performances que de demander le téléchargement d'une feuille de style distincte sur chaque page vue (même si elle est limitée aux quelques publications / pages avec le shortcode). La seule raison d'utiliser des feuilles de style distinctes en premier lieu est qu'elles peuvent être mises en cache par le navigateur . Les feuilles de style dynamiques ne peuvent pas être mises en cache.
Doug

2
Est-ce toujours la bonne façon de procéder?
Dave Kiss

2

Voici comment je le fais habituellement:

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

J'ai eu du mal avec toutes les recommandations de cet acabit - peut-être que je suis un peu épais, ou peut-être que les contributeurs ont perdu le contact commun.

J'ai décidé de coder cela dans le fichier php du 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'/>";

Cela semble fonctionner. Il ne se charge que sur les pages qui utilisent le plugin. Il se charge après la balise h1, ce qui me convient. Je ne vois pas comment cela pourrait être plus efficace ou plus clair.

.... mais peut-être que je me trompe - j'ai dit que j'étais un peu épais.


Vous ne devez charger que des <link>éléments dans la tête de page
shea

Yerss. Ce serait parce que votre CSS veut tout affecter du haut de la page vers le bas. Je suis heureux de n'affecter que ce qui vient après la balise h1. Je n'ai pu faire fonctionner aucun des exemples (je pense qu'ils peuvent être mal expliqués). Essayez-le par vous-même sur un morceau de test html. Si je me trompe, dites-le moi :)
chazza

@chazza Ce n'est pas la seule raison. Lorsqu'un navigateur détecte des styles après l'écriture de la balise body, il arrête tout ce qu'il fait jusqu'à ce que ce style soit chargé et appliqué, ce qui est mauvais pour les performances et conduit à des reflux d'écran et à des flashs de texte sans style. Cependant, si cela n'a pas vraiment d'importance, jetez ces fichiers CSS comme vous l'avez dit. Je le fais tout le temps et en fin de compte ça va. Pas optimal, mais bien.
Dan Gayle

0

Mise à jour depuis Wordpress 3.3

Il existe une fonction appelée wp_add_inline_style qui peut être utilisée pour ajouter dynamiquement des styles en fonction des options de thème / plugin. Cela peut être utilisé pour ajouter un petit fichier CSS dans la tête qui devrait être rapide et efficace.

<?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' );
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.