[Webdesign] Compression des CSS dans Wordpress: une solution simple mais efficace
Comme vous le savez surement, depuis la sortie de Wordpress 2.8, les feuilles de styles sont compressées automatiquement, ce qui permet de rendre votre site plus rapide et de consommer moins de bande passante. Bref, que du bon !
Seul problème, cela ne concerne que les feuilles de styles de l’interface d’administration. Celles des pages visibles par tous les visiteurs ne sont donc pas optimisĂ©es, ce qui est bien dommage car ce sont celles qui sont le plus tĂ©lĂ©chargĂ©es.
Bien entendu, il est possible d’installer un plugin pour rĂ©aliser cette opĂ©ration. On peut citer par exemple WP-CSS (voir la prĂ©sentation par l’ami Dator ici) ou WP-Minify, un très bon plugin.
Personnellement, je me méfie des plugins et je préfère développer des petites solutions simples à maintenir. Voici donc ma solution home-made et qui pourtant fonctionne très bien.
0 – Source et rĂ©sultat
Avant de commencer, jetez un coup d’Ĺ“il, Ă ma feuille de styles et avant compression et après.
Avant:

(oui, je suis un grand malade de l’indentation
).
Après:
![]()
Je pense que c’est assez parlant. Voyons maintenant comment faire.
1 – DĂ©clarer les feuilles de styles CSS avec wp_enqueue_style()
Pour avoir un contrĂ´le total sur vos feuilles de styles et les rendre disponibles dans certaines pages (ou les exclure), une bonne pratique consiste Ă utiliser la fonction wp_enqueue_style().
Ainsi, vous remplacez les directives HTML comme celle-ci (présente dans votre header.php en général):
<link rel='stylesheet' id='test' href='http://blog.websourcing.fr/xxx/test.css' type='text/css' media='all' />
par la fonction PHP suivante, dans le fichier function.php:
add_action('wp_enqueue_scripts', 'frond_end_scripts');
function frond_end_scripts() {
wp_enqueue_style ( 'style', ''http://blog.websourcing.fr/xxx/test.css'', 'all');
...
}
Le paramètre ‘all’ dĂ©signe « toutes les pages et billets ». Il est possible de n’inclure que les pages, ou que les billets , …
La plateforme Wordpress se chargera alors d’inclure les entĂŞtes nĂ©cessaires au bon endroit, sans aucune intervention supplĂ©mentaire de votre part.
2 – DĂ©clarer la fonction pour compresser
Dans le fichier function.php, il faut ajouter la fonction pour compresser les feuilles de styles.
Je vous la donne telle qu’elle existe sur mon blog. Il est possible de faire mieux je pense, notamment avec des expressions rĂ©gulières.
/*retirer le point (pb de plugin) */
func.tion compress_css($filePath, $fileName, $fileExtention) {
/* if file doesn't exist or is outdated */
$minifiedFile = $filePath.$fileName.'.min'.$fileExtention;
$normalFile = $filePath.$fileName.$fileExtention;
if(!file_exists($minifiedFile) || (filemtime($minifiedFile) < filemtime($normalFile))){
$buffer = file_get_contents($normalFile);
/* remove comments */
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
/* remove tabs, spaces, newlines, etc. */
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", " "), '', $buffer);
$buffer = str_replace(array(" {", "{ ", " { "), "{", $buffer);
$buffer = str_replace(array("} ", " }", " } "), "}", $buffer);
$buffer = str_replace(array(": ", " :", " : "), ":", $buffer);
$buffer = str_replace(array("; ", " ;", " ; "), ";", $buffer);
$buffer = str_replace(array(", ", " ,", " , "), ",", $buffer);
/* add timestamp */
$buffer.='/*'.gmdate('Y-m-d H:i:s').'*/';
/* write file */
$handle = null;
if ($handle = fopen($minifiedFile, 'w')) {
fwrite($handle, $buffer);
//echo $buffer;
}
else{ echo "write error on file $minifiedFile";}
fclose($handle);
}
return get_bloginfo('url').'/'.$minifiedFile;
}
Bien entendu il sera possible d’intĂ©grer l’appel Ă cette fonction directement dans wp_enqueue_script en utilisant le hook adĂ©quat.
Il ne faut pas oublier de donner les droits d’Ă©criture Ă l’application dans ce rĂ©pertoire. Un chmod 775 suffit.
3 – DĂ©clarer les feuilles de styles CSS concernĂ©es
La fonction prĂ©cĂ©dente retourne le chemin et le nom de la feuille de styles « minifiĂ©e ». Il suffit donc de l’intĂ©grer dans la dĂ©claration de celle-ci Ă Worpdress, dans le fichier function.php. Remplacez donc la dĂ©claration prĂ©cĂ©dente (voir point 1) par celle-ci:
$cssFile = compress_css('wp-content/themes/websourcingmagazine/xxx/', 'test', '.css');
wp_enqueue_style ( 'style', $cssFile, 'all');
Le troisième paramètre (l’extension) me permettra d’aller plus loin par la suite.
4 – Conclusion
La petite fonction fonctionne très bien chez moi. Je passe pour ma feuille de styles CSS principale de 18,5 Ko à 13,5 Ko (soit 27% de moins).
![]()
De plus, chaque modification de la feuille de styles « normale’, entraine la rĂ©gĂ©nĂ©ration de la feuille de styles « compressĂ©e », le tout automatiquement. Je n’ai plus Ă me soucier des synchronisations et je peux travailler sur une source « lisible« .
Enfin, je n’ai pas installĂ© de plugin.
Je vais Ă©tendre cette technique pour les scripts Javascript. J’en ferais certainement un billet dans les prochains jours.








Citer #1 par Pakito le 27 juin 2009 - 12:34
Merci pour les infos et les astuces.
J’appliquerai ça Ă mon nouveau thème.
Citer #2 par Lionel Roux le 28 juin 2009 - 22:29
Perso j’en suis très content. C’est efficace et simple.
Citer #3 par stefff le 29 juin 2009 - 10:38
Bonjour,
Perso je n’utilise pas wordpress, mais pour compresser mes feuilles de style j’utilise ce site.
http://floele.flyspray.org/csstidy/css_optimiser.php
Il peut Ă©galement ĂŞtre utile, du moins je pense c’est pour ça que je partage ce lien.
Bravo pour votre site
stefff
Citer #4 par Let le 2 juillet 2009 - 23:46
Au top de l’optimisation et grand malade de l’indentation, j’adore !
Citer #5 par Valentin le 15 juillet 2009 - 15:20
Tout simplement énorme ! Merci
Pour ma part, j’utilise un plugin pour CODA (mac) il optimise en un clic le fichier CSS
Citer #6 par Lionel Roux le 15 juillet 2009 - 17:13
j’ai amĂ©liorĂ© la solution depuis, je ferais bientot un billet
Citer #7 par Samy le 16 juillet 2009 - 11:16
Pour gagner un peu de poids/vitesse, tu pourrais également activer la compression gzip sur les feuilles de style et scripts JS
Citer #8 par Lionel Roux le 16 juillet 2009 - 11:22
Oui je suis bien d’accord avec toi mais mon hĂ©bergeur n’est pas motivĂ© pour activer les mod nĂ©cessaires. Zlib est installĂ© mais pas de mod_deflate.c en vue…. il n’en voit pas l’utilitĂ©. c’est la loose.
Citer #9 par Samy le 16 juillet 2009 - 12:47
Après, tu peux peut etre changer d’hĂ©bergeur
Citer #10 par Lionel Roux le 16 juillet 2009 - 21:49
MouĂ©, je vais l’avoir Ă l’usure, comme pour mod_expires…
Citer #11 par Vince le 22 juillet 2009 - 22:22
Article très intéressant, mais comment dé-référencer le style.css original ?
Citer #12 par Lionel Roux le 22 juillet 2009 - 22:26
Il y a deux solutions en fonction de la situation de départ:
- soit le style est inséré en dur dans le header du thème; dans ce il suffit de commenter la ligne
- soit le style est mise en queue par Wordpress via wp_register_style ou wp_enqueue_style. Dans ce cas un simple wp_deregister_style suffit.
Moi j’Ă©tais dans la première situation.
@+
Citer #13 par Vince le 22 juillet 2009 - 23:40
Merci pour cette rĂ©ponse (rapide comme l’Ă©clair) qui m’a beaucoup aidĂ©.
Citer #14 par Lionel Roux le 23 juillet 2009 - 11:56
De rien, Ă bientĂ´t.
Sur Jean-Marie Gall.com le 27 juin 2009 - 19:59
[...] [Webdesign] Compression des CSS dans Wordpress: une solution simple mais efficace by Lionel de Websourcing.fr [...]
Sur [Webdesign] Compression des pages web de Wordpress en PHP - Websourcing.fr le 3 juillet 2009 - 16:38
[...] ce dernier point j’ai dĂ©jĂ rĂ©ussi Ă optimiser mes CSS de manière agile, sans plugin ni processus [...]
Sur Combinez et minifiez vos fichiers javascript avec PHP - Websourcing.fr le 9 février 2010 - 11:57
[...] fait pas Super Cache. Du coup, je me retrouve Ă devoir remettre en place mes solutions custom que j’avais expĂ©rimentĂ© pour les CSS et [...]