<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Julien Appert &#187; Trucs et astuces</title>
	<atom:link href="http://julienappert.com/category/trucs-et-astuces/feed" rel="self" type="application/rss+xml" />
	<link>http://julienappert.com</link>
	<description>Développeur / intégrateur web indépendant</description>
	<lastBuildDate>Tue, 29 Jun 2010 08:38:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Optimiser WordPress, encore, toujours&#8230;</title>
		<link>http://julienappert.com/optimiser-wordpress-encore-toujours.html</link>
		<comments>http://julienappert.com/optimiser-wordpress-encore-toujours.html#comments</comments>
		<pubDate>Thu, 11 Mar 2010 11:19:49 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[requête]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=341</guid>
		<description><![CDATA[J&#8217;ai déjà évoqué la question ici, il existe de nombreux moyens pour et, ainsi, gagner en performances. Aujourd&#8217;hui, je vais partager avec vous deux astuces, la première concernant votre base de données, et la seconde, moins essentielle, à propos de la sauvegarde des articles. Voir et analyser les requêtes effectuées Pour afficher une page, WordPress [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://julienappert.com/wordpress/wp-content/uploads/2010/03/wordpress-optimisation-bdd.jpg"><img class="aligncenter size-full wp-image-342 shadow" title="wordpress-optimisation-bdd" src="http://julienappert.com/wordpress/wp-content/uploads/2010/03/wordpress-optimisation-bdd.jpg" alt="" width="600" height="249" /></a></p>
<p>J&#8217;ai déjà évoqué la question ici, il existe de nombreux moyens pour <a href="http://julienappert.com/11-astuces-pour-optimiser-votre-wordpress.html" title="11 astuces pour optimiser votre WordPress">optimiser votre installation WordPress</a> et, ainsi, gagner en performances. Aujourd&#8217;hui, je vais partager avec vous deux astuces, la première concernant votre base de données, et la seconde, moins essentielle, à propos de la sauvegarde des articles.</p>
<h2>Voir et analyser les requêtes effectuées</h2>
<p>Pour afficher une page, WordPress doit effectuer un certain nombre de requêtes dans la base de données. Une partie de celles-ci est générée par WordPress lui-même, mais le thème utilisé va jouer un rôle important, c&#8217;est pourquoi<strong> il est recommandé de remplacer certains appels de fonction par des données en dur</strong>. Par exemple, remplacer <code>&lt;?php bloginfo('url'); ?&gt;</code> par <code>http://monsite.com</code>.</p>
<p>L&#8217;astuce que je vais vous donner vous permettra de voir précisément les requêtes effectuées pour chacune de vos pages. Ouvrez votre fichier <code>wp-config.php</code> et ajoutez-y le code suivant :</p>
<pre class="brush: php;">define('SAVEQUERIES', true);</pre>
<p>A partir de maintenant, toutes les requêtes seront sauvegardées dans une variable, ce qui aura une influence négative sur les performances. Aussi, activez cette ligne uniquement pour l&#8217;analyse, ne la gardez pas en permanence.</p>
<p>Maintenant, ouvrez le <code>footer.php</code> de votre thème et ajoutez les lignes suivantes avant la fermeture du <code>&lt;body&gt;</code> :</p>
<pre class="brush: php;">&lt;?php
if (current_user_can('administrator')){
 global $wpdb;
 echo &quot;&lt;pre&gt;&quot;;
 print_r($wpdb-&gt;queries);
 echo &quot;&lt;/pre&gt;&quot;;
}
?&gt;</pre>
<p>Une fois connecté en tant qu&#8217;administrateur, <strong>ce code affichera en bas de vos pages un tableau dont chacune des entrées détaillera : la requête exacte, le temps qu&#8217;elle a pris et l&#8217;arborescence des fonctions ayant provoqué cet appel</strong>. Testé ici-même, le code m&#8217;indique 28 requêtes pour la page d&#8217;accueil, et 42 pour un article<sup>1</sup>. Ce qui est probablement perfectible&#8230;</p>
<h2>Se passer des sauvegardes automatiques</h2>
<p>Nous avons vu dans mon précédent article sur l&#8217;optimisation qu&#8217;il était possible de désactiver les révisions (<a href="http://julienappert.com/11-astuces-pour-optimiser-votre-wordpress.html" title="11 astuces pour optimiser votre WordPress">point 6</a>). Mais WordPress continue à effectuer des sauvegardes automatiques de vos articles en cours de rédaction. C&#8217;est très pratique, sauf lorsque vous créez du contenu en masse. Par exemple, dernièrement, il m&#8217;a fallu créer une arborescence d&#8217;une vingtaine de pages. La mécanique est simple et rapide : ajout du titre, choix de la page parent, et hop, j&#8217;enregistre. Sauf que ce dernier point est ralenti à cause de la sauvegarde automatique : je dois attendre la fin de son exécution pour publier. Frustrant, à la longue.</p>
<p>Pour ne plus avoir à affronter ce problème, deux solutions :</p>
<p>1. <strong>Modifier l&#8217;intervalle de sauvegarde automatique</strong>. Toujours dans le <code>wp-config.php</code>, ajoutez le code suivant :</p>
<pre class="brush: php;">define( 'AUTOSAVE_INTERVAL', 60 );</pre>
<p>Avec de la chance, vous aurez le temps de créer votre page et de l&#8217;enregistrer avant qu&#8217;une sauvegarde auto soit lancée.</p>
<p>2. <strong>Désactiver totalement la sauvegarde automatique</strong>. Là, il va falloir créer un plugin tout simple. Créez un fichier dans votre dossier <code>plugins</code>, nommez le, par exemple, <code>disable-autosave.php</code>, et insérez le contenu suivant :</p>
<pre class="brush: php;">&lt;?php
 /*
 Plugin Name: Disable Autosave
 */
 function disable_autosave() {
 wp_deregister_script('autosave');
 }
 add_action( 'wp_print_scripts', 'disable_autosave' );
 ?&gt;</pre>
<p>Grâce à ce plugin, le fichier javascript qui gère la sauvegarde auto ne sera plus appelé : vous en êtes libéré !</p>
<ol class="footnotes"><li id="footnote_0_341" class="footnote"> <a rel="nofollow" href="http://fr.wikipedia.org/wiki/La_grande_question_sur_la_vie,_l'univers_et_le_reste">42&#8230; La réponse ultime à la grande question sur la vie, l&#8217;univers et le reste</a></li></ol>]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/optimiser-wordpress-encore-toujours.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Redéfinir les listes HTML générées par WordPress</title>
		<link>http://julienappert.com/redefinir-les-listes-html-generees-par-wordpress.html</link>
		<comments>http://julienappert.com/redefinir-les-listes-html-generees-par-wordpress.html#comments</comments>
		<pubDate>Fri, 19 Feb 2010 12:26:21 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[développeur]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=329</guid>
		<description><![CDATA[WordPress dispose de fonctions très pratiques pour afficher le contenu. Pour afficher la liste des pages disponibles de manière hiérarchique, il suffit d&#8217;utiliser la fonction wp_list_pages(), qui va générer toute seule le code HTML nécessaire, avec les listes imbriquées. Seulement voilà, parfois, on a besoin de personnaliser un peu ce code HTML. Par exemple, moi, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="shadow aligncenter" title="wordpress-wp-list-pages" src="http://julienappert.com/wordpress/wp-content/uploads/2010/02/wordpress-wp-list-pages.jpg" alt="" width="600" height="266" /><br />
WordPress dispose de fonctions très pratiques pour afficher le contenu. Pour afficher la liste des pages disponibles de manière hiérarchique, il suffit d&#8217;utiliser la fonction <code>wp_list_pages()</code>, qui va générer toute seule le code HTML nécessaire, avec les listes imbriquées.</p>
<p>Seulement voilà, <strong>parfois, on a besoin de personnaliser un peu ce code HTML</strong>. Par exemple, moi, j&#8217;avais besoin d&#8217;ajouter une classe sur les liens, ce qui n&#8217;a pas été prévu par WordPress. Qu&#8217;à cela ne tienne, me direz-vous, il suffit de réécrire la fonction ! Pas si simple, car celle-ci utilise <strong>un système très efficace mais relativement compliqué appelé <code>Walker</code></strong> (que vous trouverez dans le fichier <code>wp-includes/classes.php</code>). Et croyez-moi, vous n&#8217;avez pas envie de réécrire tout ça !</p>
<p>Le léger hack suivant va permettre de nous en sortir facilement.</p>
<p>Tout d&#8217;abord, il faut repérer la classe qui génère le contenu HTML. Dans le cas de la fonction <code>wp_list_pages()</code>, il s&#8217;agit de la classe <code>Walker_Page</code> (qui se trouve aussi dans le fichier précédemment cité). Copiez la dans votre plugin ou dans le fichier <code>functions.php</code> de votre thème, en prenant soin d&#8217;en modifier le nom. Par exemple :</p>
<pre class="brush: php;">class Walker_Page_modified extends Walker { ... }</pre>
<p>Profitez en pour adapter le code HTML à vos besoins. Maintenant, voyons comment dire à WordPress d&#8217;utiliser votre classe personnalisée. Tout se passe dans les paramètres de la fonction <code>wp_list_pages()</code> :</p>
<pre class="brush: php;">wp_list_pages(  array( 'walker' =&gt; new Walker_Page_modified() )  );</pre>
<p>Et voilà, c&#8217;est aussi simple que ça ! Vous avez réussi à plier WordPress à vos besoins, et non le contraire.</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/redefinir-les-listes-html-generees-par-wordpress.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Créer des éléments HTML avec jQuery 1.4</title>
		<link>http://julienappert.com/creer-des-elements-html-avec-jquery-1-4.html</link>
		<comments>http://julienappert.com/creer-des-elements-html-avec-jquery-1-4.html#comments</comments>
		<pubDate>Fri, 15 Jan 2010 14:37:49 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=289</guid>
		<description><![CDATA[Si vous avez déjà essayé d&#8217;ajouter des éléments HTML avec javascript, vous le savez : c&#8217;est la croix et la bannière !  Pour faciliter cette action, la dernière version de jQuery (1.4) propose une nouvelle syntaxe appelée : Quick Element Construction. C&#8217;est d&#8217;une simplicité déconcertante : jQuery(&#34;&#60;div&#62;&#34;, { id: &#34;foo&#34;, css: { height: &#34;50px&#34;, width: [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous avez déjà essayé d&#8217;ajouter des éléments HTML avec javascript, vous le savez : c&#8217;est la croix et la bannière !  Pour faciliter cette action, la dernière version de jQuery (1.4) propose une nouvelle syntaxe appelée : <a href="http://api.jquery.com/jQuery/#jQuery2">Quick Element Construction</a>. C&#8217;est d&#8217;une simplicité déconcertante :</p>
<pre class="brush: jscript;">jQuery(&quot;&lt;div&gt;&quot;, {
 id: &quot;foo&quot;,
    css: {
        height: &quot;50px&quot;,
        width: &quot;50px&quot;,
        color: &quot;blue&quot;,
        backgroundColor: &quot;#ccc&quot;
    },
    click: function() {
       $(this).css(&quot;backgroundColor&quot;, &quot;red&quot;);
    }
}).appendTo(&quot;body&quot;);</pre>
<p>Je suis déjà fan. La liste des fonctionnalités ajoutées à jQuery 1.4 est disponible sur le site <a href="http://jquery14.com/day-01/jquery-14">jquery14.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/creer-des-elements-html-avec-jquery-1-4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lunascape, le navigateur qui inclut Firefox, Chrome et Windows Explorer</title>
		<link>http://julienappert.com/lunascape-le-navigateur-qui-inclut-firefox-chrome-et-windows-explorer.html</link>
		<comments>http://julienappert.com/lunascape-le-navigateur-qui-inclut-firefox-chrome-et-windows-explorer.html#comments</comments>
		<pubDate>Mon, 04 Jan 2010 15:52:52 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[intégrateur]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[navigateur]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=269</guid>
		<description><![CDATA[Mon titre n&#8217;est pas tout à fait exact : le navigateur Lunascape, développé par des japonais, inclut Gecko, Webkit et Trident, qui sont les moteurs de rendu respectifs des navigateurs sus-cités. Le principe est intéressant pour les intégrateurs. Grâce à Lunascape, on peut facilement (via une unique interface) vérifier le rendu final de notre travail [...]]]></description>
			<content:encoded><![CDATA[<p><img class="shadow aligncenter size-full wp-image-270" title="lunascape" src="http://julienappert.com/wordpress/wp-content/uploads/2010/01/lunascape.jpg" alt="" width="550" height="165" /></p>
<p>Mon titre n&#8217;est pas tout à fait exact : le navigateur <a href="http://www.lunascape.tv/">Lunascape</a>, développé par des japonais, inclut <strong>Gecko, Webkit et Trident</strong>, qui sont les moteurs de rendu respectifs des navigateurs sus-cités. Le principe est intéressant pour les intégrateurs. Grâce à Lunascape, on peut facilement (via une unique interface) <strong>vérifier le rendu final de notre travail sur les plus importants navigateurs du marché</strong>. Le logiciel intègre d&#8217;ailleurs des outils de deboguage assez utiles. Il est également possible de l&#8217;étendre avec des modules complémentaires&#8230; enfin, si vous comprenez le Japonais, car malheureusement, <a href="http://plugin.lunascape.jp/">le site hébergeant les plugins</a> est accessible uniquement dans cette langue.</p>
<p><img class="shadow aligncenter size-full wp-image-271" title="lunascape-plugin-center" src="http://julienappert.com/wordpress/wp-content/uploads/2010/01/lunascape-plugin-center.jpg" alt="" width="550" height="150" /></p>
<p>Bref, <strong>Lunascape pourrait devenir l&#8217;outil ultime pour les intégrateurs de tous pays&#8230; s&#8217;il gérait les versions</strong>. Car le gros problème des intégrateurs, ce n&#8217;est pas vraiment d&#8217;afficher correctement leur travail sur les différents navigateurs. Globalement, les dernières versions respectent suffisamment les standards pour que leur rendu soit similaire. Non, le gros problème, c&#8217;est que leur travail s&#8217;affiche correctement <strong>Y COMPRIS</strong> dans les versions précédentes ! C&#8217;est-à dire au moins Firefox 2, Firefox 3, IE 6 et IE7. Et là, Lunascape n&#8217;est d&#8217;aucune utilité puisqu&#8217;il n&#8217;inclut que les dernières versions des moteurs de rendu.</p>
<p>Dans l&#8217;état actuel des choses, Lunascape n&#8217;est qu&#8217;<strong>une curieuse nouveauté prometteuse</strong>. Pour la production, je reste donc fidèle à <a href="http://www.my-debugbar.com/wiki/IETester/HomePage">IETester</a> et à mes <a href="http://julienappert.com/ouvrir-plusieurs-instances-de-firefox.html" title="Ouvrir plusieurs instances de Firefox">différentes instances de Firefox</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/lunascape-le-navigateur-qui-inclut-firefox-chrome-et-windows-explorer.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress : comment personnaliser l&#8217;aperçu des articles</title>
		<link>http://julienappert.com/wordpress-comment-personnaliser-lapercu-des-articles.html</link>
		<comments>http://julienappert.com/wordpress-comment-personnaliser-lapercu-des-articles.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 08:00:06 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[tinymce]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=186</guid>
		<description><![CDATA[Quand vous écrivez un nouvel article ou une nouvelle page, l&#8217;éditeur de WordPress vous laisse le choix entre deux interfaces : visuelle et HTML. Si vous maîtrisez le HTML et si vous tapotez du clavier à la vitesse de la lumière, ce dernier choix est un bon choix. Néanmoins, si vous préférez avoir un aperçu [...]]]></description>
			<content:encoded><![CDATA[<p><img class="shadow aligncenter" title="wordpress-tinymce" src="http://julienappert.com/wordpress/wp-content/uploads/2009/12/wordpress-tinymce.png" alt="wordpress-tinymce" width="600" height="150" />Quand vous écrivez un nouvel article ou une nouvelle page, l&#8217;éditeur de WordPress vous laisse le choix entre <strong>deux interfaces : visuelle et HTML</strong>. Si vous maîtrisez le HTML et si vous tapotez du clavier à la vitesse de la lumière, ce dernier choix est un bon choix. Néanmoins, si vous préférez avoir un aperçu plus visuel de l&#8217;article en cours de rédaction, l&#8217;intérêt de l&#8217;interface du même nom est évident.</p>
<p>Grâce à cette interface visuelle, vous pouvez <strong>modifier le contenu de votre article en voyant immédiatement le rendu final</strong>. Malheureusement, ce rendu n&#8217;est pas parfait, car il ne correspond pas vraiment au style de votre site web. Sachez cependant que <strong>ce rendu est personnalisable</strong>, et si cette personnalisation n&#8217;est pas proposée de base dans WordPress, nous pouvons la réaliser simplement avec quelques lignes de code.</p>
<h2>TinyMCE, l&#8217;éditeur riche universel</h2>
<p>L&#8217;interface visuelle utilise un <strong>éditeur riche très puissant nommé TinyMCE</strong>. Il est très personnalisable et permet la création de plugins : c&#8217;est grâce à cette extensibilité que l&#8217;on peut ajouter des boutons dans la barre d&#8217;outils aussi facilement, comme c&#8217;est le cas pour le <a href="http://julienappert.com/realisations/plugin-link-to-post" title="Plugin Link To Post">plugin Link To Post</a>. Cette grande malléabilité en a fait le candidat idéal pour être introduit dans bien des projets web, comme WordPress ou Joomla.</p>
<h2>Appliquer une feuille de style</h2>
<p>Entre autres fonctionnalités proposées par TinyMCE, celle qui nous intéresse est l&#8217;application d&#8217;une feuille de style. En effet grâce à un paramètre renseigné à l&#8217;initialisation de l&#8217;éditeur, il est possible de le forcer à utiliser une feuille de style externe de notre choix.</p>
<p><strong>1. Créer la feuille de styles</strong></p>
<p>Vous pouvez toujours demander à TinyMCE d&#8217;importer directement la feuille de styles de votre site, mais le résultat risque d&#8217;être&#8230; intéressant. Ou en tout cas, probablement pas celui que vous escomptez. Non le mieux est de réaliser une feuille de styles indépendante qui contiendra uniquement les styles élémentaires, à savoir couleur de fond, choix de la police, taille et couleur de chaque élément HTML. Appelez ce fichier, disons, mce.css, et chargez le dans le dossier de votre thème.</p>
<p><strong>2. Expliquer à l&#8217;éditeur où la trouver</strong></p>
<p>Votre thème possède très probablement un fichier nommé functions.php. Si ce n&#8217;est pas le cas, créez-en un. Editez le, et ajoutez les lignes de code suivantes :</p>
<pre class="brush: php;">function tinymce_perso_css($wp) {

 return $wp .= ',' . get_bloginfo('template_url') . '/mce.css';
}
add_filter( 'mce_css', 'tinymce_perso_css' );</pre>
<p>Voilà, c&#8217;est aussi simple que ça. Votre interface visuelle d&#8217;édition utilisera les styles présents dans mce.css et le rendu sera désormais plus proche de vrai rendu final.</p>
<h2>Sélectionner manuellement les styles à appliquer</h2>
<p>Il est possible d&#8217;aller un peu plus loin. Imaginons que vous désiriez <strong>appliquer différents styles css à vos paragraphes</strong> : par exemple, encadrer une ligne de texte. Par défaut, le TinyMCE personnalisé par WordPress affiche une liste déroulante vous permettant de sélectionner un format : paragraphe, adresse, titre 1, titre 2, etc. Mais vous pouvez également lui demander d&#8217;afficher une liste similaire qui vous proposera différents styles à appliquer. Cette manipulation est très simple :</p>
<p><strong>1. Demander l&#8217;affichage de la liste déroulante des styles</strong></p>
<p>Editez à nouveau votre fichier functions.php et ajoutez le code suivant :</p>
<pre class="brush: php;">function tinymce_buttons($buttons){
 $style = array('styleselect');
 $buttons = array_merge($style,$buttons);
 return $buttons;
}
add_filter('mce_buttons_2', 'tinymce_buttons');</pre>
<p>La liste s&#8217;affichera au tout début de la seconde ligne de la barre d&#8217;outils de l&#8217;éditeur. Curieusement, la liste n&#8217;apparaitra pas si vous choisissez &#8216;mce_buttons_1&#8242;.</p>
<p><strong>2. Créer les styles personnalisés</strong></p>
<p>La liste déroulante possède déjà quelques styles par défaut. Mais vous pouvez en ajouter en éditant le fichier mce.css précédemment créé et en ajoutant des classes css. Par exemple :</p>
<pre class="brush: css;">.cadre{ border:1px dashed #000; }</pre>
<p>Il ne vous reste plus qu&#8217;à sélectionner le texte et à choisir le style &laquo;&nbsp;cadre&nbsp;&raquo; dans la liste déroulante.</p>
<p>Grâce à ces quelques modifications très simples, vous avez à présent un rendu visuel proche de votre rendu final et pourrez facilement appliquer des styles css à votre prose.</p>
<p><strong>Si vous êtes sages, je parlerais à nouveau des possibilités offertes par TinyMCE dans de prochains articles. C&#8217;est une zone stratégique de WordPress qui mérite d&#8217;être éclaircie !</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/wordpress-comment-personnaliser-lapercu-des-articles.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>11 astuces pour optimiser votre WordPress</title>
		<link>http://julienappert.com/11-astuces-pour-optimiser-votre-wordpress.html</link>
		<comments>http://julienappert.com/11-astuces-pour-optimiser-votre-wordpress.html#comments</comments>
		<pubDate>Tue, 24 Nov 2009 10:43:18 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=125</guid>
		<description><![CDATA[Tripwire Magazine publie un article très complet sur l&#8217;optimisation de WordPress (découvert grâce à AW), qui liste 11 astuces dans l&#8217;ordre décroissant de leur impact sur la performance. Comme l&#8217;article est long et en anglais, je me permets d&#8217;en faire ici un résumé en français (et non pas une traduction). Pour plus de détails, rendez-vous [...]]]></description>
			<content:encoded><![CDATA[<p>Tripwire Magazine publie un article très complet sur <a href="http://www.tripwiremagazine.com/wordpress/wordpress/optimize-wordpress-for-professional-performance.html">l&#8217;optimisation de WordPress</a> (découvert grâce à <a href="http://twitter.com/dyuka">AW</a>), qui liste 11 astuces dans l&#8217;ordre décroissant de leur impact sur la performance. Comme l&#8217;article est long et en anglais, je me permets d&#8217;en faire ici un résumé en français (et non pas une traduction). Pour plus de détails, rendez-vous directement sur l&#8217;article en question.</p>
<p><img class="aligncenter size-full wp-image-130" title="tripwire magazine" src="http://julienappert.com/wordpress/wp-content/uploads/2009/11/tripwire-magazine.jpg" alt="tripwire magazine" width="600" height="285" /></p>
<h3>1. Mettre en place un cache performant</h3>
<p>Utiliser un cache consiste à créer des pages HTML sur votre serveur à partir des pages générées par WordPress. Ensuite  le serveur n&#8217;a plus qu&#8217;à présenter ces pages, sans effectuer les multiples requêtes normalement nécessaires à leur affichage. Il existe plusieurs plugins de cache pour WordPress, mais le meilleur semble être <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache Plugin</a>. Il permet un réglage précis du système de cache et permet notamment de préciser si une partie spécifique de la page doit rester dynamique (par exemple la liste des derniers commentaires).</p>
<p>Cette astuce est celle qui a le plus d&#8217;impact sur l&#8217;optimisation wordpress : si vous devez en choisir une, prenez celle-ci !</p>
<h3>2. Optimiser votre thème en réduisant le nombre de requêtes au serveur, à la base de données et en diminuant son poids global</h3>
<p><strong>supprimer les requêtes PHP inutiles.</strong> Les thèmes téléchargeables sont faits de telle manière que vous n&#8217;ayez pas besoin de les modifier pour les appliquer à votre site. Par exemple, le lien vers la page d&#8217;accueil est généré grâce à l&#8217;appel de la fonction get_option(&#8216;url&#8217;), qui va donc faire une requête dans la base de données. Vous savez que votre page d&#8217;accueil ne changera jamais d&#8217;URL ? Alors modifiez le thème en remplaçant la fonction PHP par votre URL en dur, et vous ferez du bien à votre serveur ! L&#8217;astuce est bien sûr applicable toutes les fois où vous trouverez la fonction get_option() dans votre thème.</p>
<p><strong>Réduire le nombre de requêtes au serveur. </strong>Une page qui s&#8217;affiche dans le navigateur signifie souvent un nombre impressionnant d&#8217;appel de fichiers : les images, bien sûr, mais aussi les feuilles de styles et les fichiers javascript. Cela réduit d&#8217;autant les performances d&#8217;affichage de votre site. Il y a deux moyens d&#8217;améliorer les choses. Tout d&#8217;abord, combiner ces fichiers, c&#8217;est à dire, pour les images, utiliser les <a href="http://alistapart.com/articles/sprites">sprites CSS</a>, copier le contenu de tous vos fichiers css dans un seul et unique fichier et faire de même pour les fichiers js. Ensuite, compressez ces fichiers en supprimant les blancs pour réduire leur poids. Evidemment, il existe des plugins wordpress pour ça : <a href="http://wordpress.org/extend/plugins/wp-css/">WP CSS</a> et <a href="http://wordpress.org/extend/plugins/wp-js/">WP JS</a>. Le seul problème, c&#8217;est que vous n&#8217;avez pas facilement la main sur les fichiers css et js ajoutés par les différents plugins installés&#8230;</p>
<p><strong>Placer les appels javascript en bas de page.</strong> Le principal, c&#8217;est d&#8217;afficher votre contenu, n&#8217;est-ce pas ? Le javascript peut attendre. Placez, par exemple, vos codes pour la gestion des statistiques dans le footer.</p>
<p><strong>Prévoyez un cache d&#8217;expiration pour ces fichiers.</strong> Tous les fichiers que le navigateur appelle pour afficher une page sont téléchargés sur le disque dur. S&#8217;il n&#8217;est pas désactivé, les navigateurs ont un système de cache interne qui fait qu&#8217;ils ne téléchargeront pas une seconde fois un fichier qu&#8217;ils ont déjà pendant un certain temps. Vous pouvez maitriser cette durée pour chacun de vos fichiers en <a href="http://www.tipsandtricks-hq.com/how-to-add-far-future-expires-headers-to-your-wordpress-site-1533">précisant des dates d&#8217;expiration pour votre fichier .htaccess</a>.</p>
<h3>3. Nettoyer votre base de données</h3>
<p>Les bases de données ont besoin d&#8217;être optimisées, nettoyées régulièrement, sans quoi leurs performances s&#8217;en font ressentir. Pour cela il suffit de lancer la procédure d&#8217;optimisation prévue dans phpmyadmin. Si vous n&#8217;y avez pas accès, vous pouvez installer le plugin <a href="http://wordpress.org/extend/plugins/wp-dbmanager/">WP DBManager</a>, qui vous permettra de le faire.</p>
<h3>4. Héberger vos images ailleurs</h3>
<p>Un moyen simple d&#8217;économiser les ressources de votre serveur est de faire héberger vos images ou autres fichiers statiques sur des services externes, comme <a href="http://aws.amazon.com/s3/">Amazon S3 Storage service</a>. Evidemment, choisissez bien le site externe sur lequel vous hébergerez ces fichiers,  car il ne faudrait qu&#8217;il ralentisse l&#8217;affichage de votre site <img src='http://julienappert.com/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  (Amazon Storage semble une bonne solution de ce point de vue). Il reste également la possibilité d&#8217;appeler directement des images hébergées par le site de vos voisins, mais ce n&#8217;est vraiment, vraiment pas gentil (on appelle cette pratique du hotlinking).</p>
<h3>5. Activer le cache WP Built-in</h3>
<p>WordPress inclut de base un système de cache pour les objets PHP. Il est désactivé par défaut car il provoque une augmentation significative de l&#8217;utilisation de la mémoire du serveur, ce que votre hébergeur n&#8217;appréciera pas si vous êtes sur un serveur mutualisé. A manier avec précaution donc. Pour l&#8217;activer, rendez-vous dans la page wp-config.php :<br />
<code>define(ENABLE_CACHE, true);</code></p>
<h3>6.  Désactiver/limiter/nettoyer les révisions de billets</h3>
<p>WordPress garde en mémoire les différentes versions de chaque billet : les révisions. Très pratique dans le cadre d&#8217;un travail collaboratif, mais cette accumulation de versions finit par prendre une place conséquente dans la base de données. Si les révisions ne vous sont pas d&#8217;une utilité renversante, autant vous en débarrasser. Pour désactiver leur création, voici une ligne à ajouter dans le wp-config.php :<br />
<code>define(’WP_POST_REVISIONS’, false);</code></p>
<p>Un compromis consiste à garder les révisions mais à en limiter le nombre :<br />
<code>define(’WP_POST_REVISIONS’, no_of_revision);</code></p>
<p>Mais bien sûr, cela ne supprimera pas les révisions déjà présentes dans votre base de données. Si vous n&#8217;avez pas accès facilement à phpmyadmin, vous pouvez utiliser le plugin <a href="http://wordpress.org/extend/plugins/delete-revision/">delete-revision</a>, qui fait ça très bien.</p>
<h3>7. Toujours mettre à jour WordPress et ses plugins</h3>
<p>En plus des nouvelles fonctionnalités offertes par ces mises à jour, elles offrent bien souvent des améliorations en terme de sécurité et de performance. Attention néanmoins à l&#8217;installation des plugins : ils ne sont pas toujours codés dans les règles de l&#8217;art et peuvent représenter des problèmes de sécurité et de performance.</p>
<h3>8. Supprimer les thèmes non utilisés</h3>
<p>Il n&#8217;y a aucune raison de garder un tas de fichiers inutiles sur le serveur, n&#8217;est-ce pas ?</p>
<h3>9. Désactiver et supprimer les plugins non désirés</h3>
<p>Si vous décidez de ne plus utiliser un plugin, désactivez et supprimez le.</p>
<h3>10. Supprimer les commentaires indésirables (spam)</h3>
<p>Les commentaires indésirables, même s&#8217;ils ne sont pas affichés sur le site, sont présents dans la base de données. Autant les supprimer régulièrement pour libérer de la place. Un plugin vous aidera à le faire facilement : <a href="http://www.ruhanirabin.com/wp-optimize/">WP-Optimize</a> (il peut également vous être utile pour supprimer les révisions évoquées plus haut).</p>
<h3>11. Vérifier les liens morts</h3>
<p>Cette dernière astuce n&#8217;a pas vraiment d&#8217;impact sur l&#8217;optimisation des performances de votre site, mais il n&#8217;est pas négligeable sur l&#8217;expérience utilisateur. Il n&#8217;est pas rare que vos anciens billets pointent vers des liens morts, que ce soit vers des sites externes ou vers d&#8217;anciennes partie de votre propre site. Vous pouvez effectuer la vérification facilement grâce au plugin <a href="http://wordpress.org/extend/plugins/broken-link-checker/">Broken Link Checker</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/11-astuces-pour-optimiser-votre-wordpress.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>API Google Analytics : comment manipuler facilement les données de statistiques</title>
		<link>http://julienappert.com/api-google-analytics-comment-manipuler-facilement-les-donnees-de-statistiques.html</link>
		<comments>http://julienappert.com/api-google-analytics-comment-manipuler-facilement-les-donnees-de-statistiques.html#comments</comments>
		<pubDate>Tue, 17 Nov 2009 13:52:20 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google analytics]]></category>
		<category><![CDATA[statistiques]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=97</guid>
		<description><![CDATA[Suivre quotidiennement ses statistiques de fréquentation, quand on a plusieurs sites en ligne, ce n&#8217;est pas une sinécure ! Google Analytics est un service très pertinent, mais le nombre de clics nécessaire pour avoir une vision globale est plutôt rébarbatif. Heureusement, l&#8217;API permet de se concocter un rapport personnalisé assez facilement, notamment avec le projet [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://julienappert.com/wordpress/wp-content/uploads/2009/11/google-analytics.png" alt="google-analytics" title="google-analytics" width="224" height="42" class="alignleft size-full wp-image-106" />Suivre quotidiennement ses statistiques de fréquentation, quand on a plusieurs sites en ligne, ce n&#8217;est pas une sinécure ! Google Analytics est un service très pertinent, mais <strong>le nombre de clics nécessaire</strong> pour avoir une vision globale est plutôt rébarbatif. Heureusement, l&#8217;API permet de se concocter <strong>un rapport personnalisé</strong> assez facilement, notamment avec le <strong><a href="http://code.google.com/p/gapi-google-analytics-php-interface/">projet GAPI</a>, interface de connexion pour PHP</strong>.</p>
<p>Le principe est très simple. Voici un exemple de code pour récupérer le nombre de pages vues et de visiteurs pour les 30 derniers jours, sur chacun de vos blogs :</p>
<pre class="brush: php;">&lt;?php
require 'gapi.class.php';

// informations de connexion à votre compte google analytics
define('ga_email','votre@email.com');
define('ga_password','votremotdepasse');

$ga = new gapi(ga_email,ga_password);

//on récupère les données du compte
$ga-&gt;requestAccountData();

//la requête doit se faire sur une fourchette de dates au format yyyy-mm-dd
$today  = date('Y-m-d');
$monthago= date('Y-m-d',time() - 60*60*24*30);

//pour chaque profil de site enregistré sur le compte :
foreach($ga-&gt;getResults() as $account){

 // on récupère un tableau indexé sur la &quot;date&quot; contenant les informations &quot;pageviews&quot; et &quot;visits&quot;. Le résultat est trié sur la &quot;-date&quot; (du plus gros chiffre au plus petit, donc du plus récent au plus ancien).
 $ga-&gt;requestReportData($account-&gt;getProfileId(), array('date'), array('pageviews','visits'), '-date', null, $monthago,$today); ?&gt;

 &lt;h1&gt;&lt;?php echo $account; ?&gt;&lt;/h1&gt;
 &lt;p&gt;Pages vues : &lt;?php echo $ga-&gt;getPageviews() ?&gt;&lt;/p&gt;
 &lt;p&gt;Visites : &lt;?php echo $ga-&gt;getVisits() ?&gt;&lt;/p&gt;

&lt;?php } ?&gt;</pre>
<p>Pour avoir le détail par jour, il suffit de développer un peu :</p>
<pre class="brush: php;">$ga-&gt;requestReportData($account-&gt;getProfileId(), array('date'), array('pageviews','visits'), '-date', null, $monthago, $today);

foreach($ga-&gt;getResults() as $result){ ?&gt;

&lt;h2&gt;&lt;?php echo $result; ?&gt;&lt;/h2&gt;
&lt;p&gt;Pages vues : &lt;?php echo $result-&gt;getPageviews(); ?&gt;&lt;/p&gt;
&lt;p&gt;Visites : &lt;?php echo $result-&gt;getVisits(); ?&gt; &lt;/p&gt;

&lt;?php } ?&gt;</pre>
<p>Mais on peut aller beaucoup plus loin, en récupérant les sites référents, les mots-clés ou les navigateurs utilisés. Par exemple, pour afficher les sites référents et le nombre de visites pour chacun, la requête est :</p>
<pre class="brush: php;">$ga-&gt;requestReportData($ga_profile_id, array('source','referralPath'), array('visits'), '-visits', 'medium == referral',  $monthago, $today);</pre>
<p>Notez ici la présence du filtre <code>'medium == referral'</code>, qui permet de garder uniquement les vrais sites référents dans la liste des résultats (donc exclure les moteurs de recherche). A contrario, pour afficher les mots-clés utilisés en provenance des moteurs de recherche :</p>
<pre class="brush: php;">$ga-&gt;requestReportData($ga_profile_id, array('source','keyword'), array('visits'), '-visits', 'medium == organic', $monthago, $today);</pre>
<p>Bref, il y a énormément de combinaisons possibles. La liste des données exploitables est visible sur la page <a href="http://code.google.com/intl/fr/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html">Dimensions &#038; Metrics Reference</a> de la documentation Google.</p>
<p>Grâce à ce système, nous pouvons complètement nous passer du site Google Analytics et développer notre propre interface d&#8217;étude des statistiques en fonction de nos besoins réels.</p>
<p>Dans un prochain billet, nous verrons comment utiliser l&#8217;API Google Chart pour réaliser des graphiques avec ces données.</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/api-google-analytics-comment-manipuler-facilement-les-donnees-de-statistiques.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ouvrir plusieurs instances de Firefox</title>
		<link>http://julienappert.com/ouvrir-plusieurs-instances-de-firefox.html</link>
		<comments>http://julienappert.com/ouvrir-plusieurs-instances-de-firefox.html#comments</comments>
		<pubDate>Mon, 09 Nov 2009 22:58:09 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[intégrateur]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=81</guid>
		<description><![CDATA[Une autre plaie de l&#8217;intégrateur, c&#8217;est assurer la compatibilité avec les différents navigateurs. Pire, avec leurs différentes versions ! Pour Internet Explorer, il existe plusieurs outils, notamment le très pratique IETester, qui permet de regrouper dans un seul navigateur le rendu d&#8217;IE5.5, d&#8217;IE 6, 7 et 8. Mais se pose également le problème des versions [...]]]></description>
			<content:encoded><![CDATA[<p>Une autre plaie de l&#8217;intégrateur, c&#8217;est assurer la compatibilité avec les différents navigateurs. Pire, <strong>avec leurs différentes versions</strong> ! Pour Internet Explorer, il existe plusieurs outils, notamment le très pratique <a href="http://www.my-debugbar.com/wiki/IETester/HomePage">IETester</a>, qui permet de regrouper dans un seul navigateur le rendu d&#8217;IE5.5, d&#8217;IE 6, 7 et 8. Mais se pose également le problème des versions de Firefox (2.0, 3.0 et 3.5). A priori, il n&#8217;existe pas encore de logiciel permettant de regrouper ces différentes versions de Gecko (le  moteur de rendu Mozilla) dans une seule fenêtre.</p>
<p>Bien sûr, il est possible d&#8217;installer chacune de ces versions&#8230; malheureusement, Firefox est ainsi fait qu&#8217;on ne peut ouvrir plusieurs versions du navigateur en même temps. Il faut donc fermer une instance pour en ouvrir une autre : le calvaire !</p>
<p>Sauf qu&#8217;en cherchant un peu, j&#8217;ai fini par trouver un moyen :</p>
<ul>
<li>commencez par <strong>installer les différentes versions de Firefox</strong>. Pour les trouver, il suffit d&#8217;aller sur <a href="http://releases.mozilla.org/pub/mozilla.org/firefox/releases/">le ftp de Mozilla</a>.</li>
<li>via le gestionnaire de profils de Firefox, <strong>créez un profil pour chacune des versions installées</strong>. Pour gérer ces profils, le plus simple est d&#8217;installer le plugin <a href="https://nic-nac-project.org/~kaosmos/profileswitcher-en.html">ProfileSwitcher</a> sur votre Firefox de travail.</li>
<li>créez sur votre bureau un raccourci pour chacune des versions de Firefox et modifiez leur cible pour <strong>ajouter le profil à ouvrir ainsi que la commande permettant d&#8217;ouvrir plusieurs instances</strong>. Exemple : <code>"C:\Program Files\Mozilla Firefox2.0\firefox.exe" -p "Firefox2.0" -no-remote</code></li>
</ul>
<p style="text-align: center;"><img class="size-full wp-image-87 aligncenter" title="instances-firefox" src="http://julienappert.com/wordpress/wp-content/uploads/2009/11/instances-firefox.jpg" alt="instances-firefox" width="370" height="197" /></p>
<p>Et voilà le travail ! Ah la la, la vie était quand même plus simple avant l&#8217;arrivée de Firefox, il suffisait de tester sous IE6&#8230;</p>
<p>&#8230;</p>
<p>Nan je déconne.</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/ouvrir-plusieurs-instances-de-firefox.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1 des 7 plaies de l&#8217;intégrateur : valider un blog plein de plugins</title>
		<link>http://julienappert.com/1-des-7-plaies-de-lintegrateur-valider-un-blog-plein-de-plugins.html</link>
		<comments>http://julienappert.com/1-des-7-plaies-de-lintegrateur-valider-un-blog-plein-de-plugins.html#comments</comments>
		<pubDate>Thu, 05 Nov 2009 23:37:16 +0000</pubDate>
		<dc:creator>Julien Appert</dc:creator>
				<category><![CDATA[Trucs et astuces]]></category>
		<category><![CDATA[code valide]]></category>
		<category><![CDATA[développeur]]></category>
		<category><![CDATA[intégrateur]]></category>

		<guid isPermaLink="false">http://julienappert.com/?p=73</guid>
		<description><![CDATA[Je suis en train de passer mon blog perso au validateur HTML et malheureusement, il y a des erreurs. Cela fait un bout de temps que je ne m&#8217;étais pas penché sur lui et j&#8217;ai une sacré palanquée de plugins installés&#8230; C&#8217;est là tout le problème. Car les développeurs ne sont pas forcément des intégrateurs. [...]]]></description>
			<content:encoded><![CDATA[<p>Je suis en train de passer mon blog perso au validateur HTML et malheureusement, il y a des erreurs. Cela fait un bout de temps que je ne m&#8217;étais pas penché sur lui et j&#8217;ai une sacré palanquée de plugins installés&#8230; C&#8217;est là tout le problème.</p>
<p>Car les développeurs ne sont pas forcément des intégrateurs. Ce sont deux métiers différents, et pourtant  <strong>le développeur est presque en permanence amené à générer du code HTML</strong>. Alors, s&#8217;il est consciencieux, il fait de son mieux et tente d&#8217;être le plus propre possible. Seulement, ce n&#8217;est pas toujours suffisant. Un exemple ? Le plugin &laquo;&nbsp;sociable&nbsp;&raquo;. Très pratique, ce plugin qui ajoute des liens pour partager l&#8217;article sur twitter, facebook, etc. Sur chacun de ces liens, le développeur a ajouté un identifiant. Très bien, c&#8217;est plus facile à styler. Voilà ce que ça donne  : <code>id="facebook", id="twitter", id="email"</code>&#8230;</p>
<p>Vous levez le lièvre ? <strong>Si ces identifiants sont bien uniques au sein du plugin, c&#8217;est une toute autre affaire une fois ce dernier intégré dans l&#8217;écosystème du blog</strong>. En l&#8217;occurence, &laquo;&nbsp;email&nbsp;&raquo; est un identifiant que l&#8217;on retrouve dans le formulaire de commentaire. Résultat, le validateur m&#8217;envoie des noms d&#8217;oiseaux à la figure.</p>
<p>C&#8217;est pourtant très simple d&#8217;éviter ces petits désagréments. En tant que développeur ET intégrateur, je fais attention à <strong>précéder tous les identifiants générés par mes plugins par le nom de ce dernier</strong>. Dans le cas du plugin sus-nommé, cela donnerait <code>id="sociable-email"</code>. Et voilà, aucun risque d&#8217;accrochage !</p>
]]></content:encoded>
			<wfw:commentRss>http://julienappert.com/1-des-7-plaies-de-lintegrateur-valider-un-blog-plein-de-plugins.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
