<?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>La Case de l&#039;Oncle Tom &#187; WordPress</title>
	<atom:link href="http://case.oncle-tom.net/categorie/web/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://case.oncle-tom.net</link>
	<description>Développement Web, bonnes pratiques et performances</description>
	<lastBuildDate>Sun, 25 Dec 2011 19:33:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="search"
           href="http://case.oncle-tom.net/opensearch"
           type="application/opensearchdescription+xml"
           title="Content Search" />		<item>
		<title>WordPress, mises à jour automatiques et FTP : la solution</title>
		<link>http://case.oncle-tom.net/2010/wordpress-updates-automatiques/</link>
		<comments>http://case.oncle-tom.net/2010/wordpress-updates-automatiques/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 16:33:14 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[upgrade]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=17698</guid>
		<description><![CDATA[Marre de mettre à jour vos extensions WordPress à la main ? Vous ne comprenez pas quoi faire avec l'écran de mise à jour FTP de WordPress ? Cet article contient la solution pour rétablir les mises à jour automatiques sans toucher à votre configuration serveur.]]></description>
			<content:encoded><![CDATA[<p>Lorsque j&#8217;étais hébergé chez <a href="http://www.ovh.com/">OVH</a>, avant de basculer vers <a href="http://alwaysdata.com/">AlwaysData</a> pour gagner en vitesse d&#8217;affichage, la mise à jour de mes extensions se faisait le plus simplement du monde depuis l&#8217;interface d&#8217;administration.</p>
<p>Seulement voilà, lors de toute tentative de mise à jour, que ce soit du blog, d&#8217;une extension ou d&#8217;un thème, un écran de configuration de paramètres <acronym title="File Transfer Protocol">FTP</acronym> apparaît. Comme nous sommes des feignants, on ne voudra en aucun cas ouvrir un serveur <acronym title="File Transfer Protocol">FTP</acronym>, qui n&#8217;aurait d&#8217;ailleurs pour d&#8217;autre intérêt que de faciliter les intrusions dans votre système.</p>
<p><span id="more-17698"></span></p>
<h3>Où trouver l&#8217;information ?</h3>
<p>En cherchant un peu, je suis tombé sur l&#8217;ensemble des <a href="http://codex.wordpress.org/Editing_wp-config.php">directives de configuration de WordPress</a>, dont les <a href="http://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants">constantes liées au système de fichier</a>.<br />
Cette section précise ce qu&#8217;il faut savoir, même si c&#8217;est suffisamment technique pour perdre toute personne ne comprenant rien au code (et on ne leur en voudra pas).</p>
<p>Le problème vient du fait que si l&#8217;<strong>utilisateur propriétaire</strong> du système de fichier n&#8217;est pas le même utilisateur du serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym>, WordPress bascule automatiquement en mise à jour via <acronym title="File Transfer Protocol">FTP</acronym>.</p>
<p>L&#8217;astuce consiste à forcer WordPress en mode <em>direct</em> (système de fichier) et à donner les droits d&#8217;écriture au <strong>groupe propriétaire</strong> correspondant à celui du serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym> (<em>www-data</em> pour Apache et Nginx sous Debian et Ubuntu).</p>
<h3>Configuration de wp-config.php</h3>
<p>Forcer le mode direct est très simple. Il suffit d&#8217;éditer le fichier <em>wp-config.php</em>, celui-là même qui contient les identifiants de connexion à la base de données et autres joyeusetés. Et d&#8217;y rajouter cette ligne, avant la première directive par exemple :</p>
<pre><code class="php">define('FS_METHOD', 'direct');</code></pre>
<p>Enregistrez, et c&#8217;est plié.</p>
<h3>Réglage des permissions</h3>
<p>Côté permissions, ça peut également se régler en 2 coups de terminal. Partons du principe que le <strong>groupe propriétaire</strong> de votre serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym> est <em>www-data</em>, à la base de votre installation WordPress, il suffit de faire ceci :</p>
<pre><code class="shell">chgrp -R www-data wp-content/upgrade wp-content/themes wp-content/plugins wp-content/uploads
chmod g+wx wp-content/upgrade wp-content/themes wp-content/plugins wp-content/uploads</code></pre>
<p>Cette manipulation attribue <em>www-data</em> comme propriétaire des répertoires que vous souhaitez rendre accessibles en écriture et ce, de manière récursive. Dans un second temps, elle attribute les droits d&#8217;écriture et d&#8217;exécution au groupe propriétaire (peu importe le nom du groupe).<br />
Si vous êtes perdu(e) avec la commande <a href="http://www.siteduzero.com/tutoriel-3-36115-les-chmod.html"><code>chmod</code>, un peu de lecture pour apprendre à le manipuler</a> (ça sauve la vie).</p>
<h3>Conclusion</h3>
<p>A ce stade des choses, tout est fonctionnel : tentez d&#8217;installer une nouvelle extension, ça passera comme une lettre à la poste.<br />
Si vous rencontrez des difficultés, c&#8217;est très certainement parce que les permissions des fichiers qui tentent d&#8217;être modifiées ne sont pas suffisantes pour le groupe propriétaire du serveur <acronym title="HyperText Transfer Protocol">HTTP</acronym>. Ajustez la procédure des permissions par rapport à votre besoin.</p>
<p>C&#8217;est pas sorcier, il suffisait de le savoir  :-)</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2010/wordpress-updates-automatiques/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Canalblog Importer : migrer de Canalblog vers WordPress en 5 clics</title>
		<link>http://case.oncle-tom.net/2010/canalblog-importer-migrer-canalblog-wordpress/</link>
		<comments>http://case.oncle-tom.net/2010/canalblog-importer-migrer-canalblog-wordpress/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 09:00:46 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[canalblog]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[xpath]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1519</guid>
		<description><![CDATA[Canalblog, en 2010, c'est près de 700 000 blogs et près de 17 millions d'articles publiés depuis l'année 2003. À ce stade, difficile de considérer cette plateforme comme négligeable puisqu'elle a bénéficié d'une capacité d'attraction suffisante pour séduire plusieurs centaines de millier d'utilisateurs.
Seul problème : ces blogs sont captifs de leur plateforme. L'extension WordPress <strong>Canalblog Importer</strong> permet de sauver votre blog Canalblog dans WordPress.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.canalblog.com/">Canalblog</a>, en 2010, c&#8217;est près de 700 000 blogs et près de 17 millions d&#8217;articles publiés depuis l&#8217;année 2003. À ce stade, difficile de considérer cette plateforme comme négligeable puisqu&#8217;elle a bénéficié d&#8217;une capacité d&#8217;attraction suffisante pour séduire plusieurs centaines de millier d&#8217;utilisateurs.</p>
<p><img class="aligncenter size-full wp-image-1521" title="Logo Canalblog" src="http://case.oncle-tom.net/images/2010/02/canalblog.png" alt="" width="217" height="95" /></p>
<p>J&#8217;ai contacté le support à plusieurs reprises pour prendre connaissance de la mise en place de noms de domaine personnalisés et de la mise en place de nouvelles fonctionnalités. Bénéficier d&#8217;une adresse en <em>monblog.fr</em> au lieu de <em>monblog.canalblog.fr</em> est intéressant, en terme d&#8217;image mais aussi d&#8217;indépendance.</p>
<p>Le gros problème est que <strong>Canalblog ne m&#8217;a jamais répondu</strong>. Ni à moi ni à plusieurs utilisateurs.<br />
En 2010, ce sont donc plus de<strong> 700 000 blogs qui se retrouvent captifs</strong> d&#8217;une plateforme avec une seule porte de sortie : le copié/collé de leurs articles. Difficilement acceptable.</p>
<h3><span id="more-1519"></span>Canalblog Importer : plugin d&#8217;import de Canalblog vers WordPress</h3>
<p>Las de ce mutisme de la part de Canablog, j&#8217;ai donc décide de me mettre à l&#8217;ouvrage pour offrir une extension WordPress répondant à ces 2 critères :</p>
<ul>
<li>importer un maximum d&#8217;éléments</li>
<li>en demander le moins possible à l&#8217;utilisateur</li>
</ul>
<p>Une fois le <em>plugin</em> activé, une nouvelle entrée fait son apparition dans la rubrique d&#8217;administration Outils &gt; Importer : <a href="http://wordpress.org/extend/plugins/canalblog-importer/">Canalblog Importer</a>.</p>
<h3>L&#8217;import Canalblog en 5 étapes</h3>
<p>L&#8217;import de son blog Canalblog se déroule par la suite en 5 étapes :</p>
<ol>
<li>Configuration</li>
<li>Import des mots-clefs</li>
<li>Import des catégories</li>
<li>Import des articles
<ul>
<li>Import des articles</li>
<li>Import des commentaires</li>
<li>Import des médias</li>
</ul>
</li>
<li>Nettoyage</li>
</ol>
<p>La configuration de l&#8217;import est le moment requérant toutes vos capacités pour taper l&#8217;<strong>adresse de votre blog</strong>. Oui c&#8217;est tout. S&#8217;ensuit alors une suite de recommandations, entre autre pour s&#8217;assurer du bon déroulement de l&#8217;import. Ça concerne la configuration des permaliens et le format de dates sur Canalblog.</p>
<p>Une fois le bouton d&#8217;import cliqué, il faudra réitérer le clic au début de chaque étape clé, la plus longue étant l&#8217;import des articles.<br />
Techniquement, sur un blog possédant plusieurs milliers d&#8217;articles sur 5 ans, il m&#8217;aura fallu à peine<strong> 20 minutes de patience et 5 clics</strong>.<br />
Difficile d&#8217;en demander plus à quelqu&#8217;un n&#8217;ayant aucune notion technique.</p>
<div id="attachment_1523" class="wp-caption aligncenter" style="width: 310px"><a href="http://case.oncle-tom.net/images/2010/02/screenshot-11.png"><img class="size-medium wp-image-1523" title="Écran de configuration de Canalblog Importer" src="http://case.oncle-tom.net/images/2010/02/screenshot-11-300x123.png" alt="" width="300" height="123" /></a><p class="wp-caption-text">Écran de configuration de Canalblog Importer</p></div>
<h3>Canalblog Importer : les fonctionnalités</h3>
<p>Les différentes étapes de l&#8217;import résument à elles seules les fonctionnalités de cet outil d&#8217;import :</p>
<ul>
<li>import des mots-clefs</li>
<li>import des catégories</li>
<li>import des articles</li>
<li>import des commentaires</li>
<li>import des médias</li>
<li>import des auteurs</li>
<li>correction des liens inter-articles</li>
<li>intégration des médias dans le gestionnaire de médias de WordPress − avec génération de vignettes à la clé et utilisation de celles-ci au sein des articles</li>
<li>reprise de l&#8217;intégration et tolérance à l&#8217;erreur : l&#8217;import peut être relancé indéfiniment, les contenus ne seront pas réimportés en double</li>
</ul>
<p>En gros, ce que cette extension ne fait pas, c&#8217;est le café, la récupération de la <em>blogroll</em> et la migration du référencement vers votre nouveau blog − faute au manque de nom de domaine et à l&#8217;impossibilité de dire aux moteurs de recherche les nouvelles adresses des articles hébergés sur Canalblog.</p>
<p>J&#8217;ai essayé de rendre toutes les <strong>étapes conviviales, explicatives et rassurantes</strong> sur le processus en cours et restant. C&#8217;est encore plus simple que de rédiger un article de blog. Enfin, je trouve <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<div id="attachment_1524" class="wp-caption aligncenter" style="width: 310px"><a href="http://case.oncle-tom.net/images/2010/02/screenshot-2.png"><img class="size-medium wp-image-1524" title="Écran d'aide à la fin d'import" src="http://case.oncle-tom.net/images/2010/02/screenshot-2-300x142.png" alt="" width="300" height="142" /></a><p class="wp-caption-text">Écran d&#39;aide à la fin d&#39;import</p></div>
<h3>La clé de la réussite : cURL et XPath</h3>
<p>Sous le capot, la dépendance à <acronym title="Pre-Hypertext Processing">PHP</acronym> 5.1+ s&#8217;explique par 3 choses :</p>
<ul>
<li>l&#8217;autoloading <acronym title="Pre-Hypertext Processing">PHP</acronym><br />
J&#8217;en ai un peu marre de faire des require à tour de bras donc je fais fi des recommandations de WordPress : PHP4 est mort, faut arrêter avec ce délire de compatibilité, pas en 2010 (ni même en 2008 ou 2009).</li>
<li><a href="http://fr.php.net/manual/en/book.curl.php">cURL</a><br />
C&#8217;est vraiment la boîte à outil de la manipulation <acronym title="HyperText Transfer Protocol">HTTP</acronym>. Elle est abstraite dans la classe WP_Http. Son utilité ? Récupérer du contenu distant. Pratique pour rapatrier le contenu de pages <acronym title="HyperText Markup Language">HTML</acronym>, entre autre.</li>
<li><a href="http://fr.php.net/manual/en/class.domxpath.php">DOMXPath</a><br />
Associé au <a href="http://fr.php.net/manual/en/book.dom.php"><acronym title="Document Object Model">DOM</acronym> PHP5</a>, c&#8217;est un outil formidable pour requêter au sein d&#8217;un document <acronym title="HyperText Markup Language">HTML</acronym> &#8230; disons, récupéré à distance ? La structure des thèmes Canalblog étant identique (pour peu qu&#8217;ils n&#8217;aient pas été retouchés en mode avancé), le travail de constitution des sélecteurs XPath n&#8217;en était que plus facilitée.</li>
</ul>
<p>Donc clairement, cette extension effectue un <strong>travail bête et méchant de <em>crawl</em> des pages d&#8217;un blog</strong>, de manière structurée afin de peupler tranquillement un blog WordPress de ce même contenu.<br />
Je me suis basé au maximum par les outils déjà existants &#8230; y compris la classe d&#8217;import WordPress.com ! Je l&#8217;ai réutilisé pour l&#8217;import des médias vu qu&#8217;elle correspondait parfaitement au besoin.</p>
<h3>Le pouvoir aux utilisateurs</h3>
<p>Au-delà du simple aspect technique de la réalisation de l&#8217;extension (qui a demandé quelques heures de travail tout de même), il faut comprendre une chose : capturer ses utilisateurs pour éviter leur fuite en cas de déclin d&#8217;un produit n&#8217;empêchera pas les utilisateurs de trouver une solution à leur problème.</p>
<p><strong>La réponse au problème de la communauté est venue de la communauté elle-même</strong> : elle veut partir ? Elle part et s&#8217;en donne les moyens.</p>
<p>Le seul moyen pour Canalblog de conserver ses utilisateurs, après cette porte de sortie offerte à tous les usagers, c&#8217;est d&#8217;innover et de les reconsidérer comme le moteur de leur croissance. Tout effort pour entraver cette démarche serait une pure perte de temps, n&#8217;ajoutant que trop de douleurs à une agonie certaine.</p>
<p><a href="http://wordpress.org/extend/plugins/canalblog-importer/">Canalblog Importer</a> est une extension gratuite pour WordPress, libre de téléchargement, d&#8217;utilisation et de modification (sous réserve que le code modifié soit republié sous la même licence). L&#8217;extension constitue ainsi une bonne base pour constituer de nouveaux imports d&#8217;autres plateformes, fermées elles aussi.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2010/canalblog-importer-migrer-canalblog-wordpress/feed/</wfw:commentRss>
		<slash:comments>207</slash:comments>
		</item>
		<item>
		<title>LESS + CSS + WordPress = WP-LESS</title>
		<link>http://case.oncle-tom.net/2009/less-css-wordpress-wp-less/</link>
		<comments>http://case.oncle-tom.net/2009/less-css-wordpress-wp-less/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 11:25:52 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[héritage]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[lessphp]]></category>
		<category><![CDATA[mixins]]></category>
		<category><![CDATA[objet]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[variables]]></category>
		<category><![CDATA[WP-LESS]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1435</guid>
		<description><![CDATA[LESS apporte ce qu'il manquait aux CSS : des variables, de l'injection de propriétés et des fonctions. Après son portage en PHP et un plugin Symfony, LESS débarque sur WordPress avec un plugin : WP-LESS. Il prend en charge tout le travail fastidieux, détecte les changements et génère les CSS à la volée.]]></description>
			<content:encoded><![CDATA[<p><a href="http://lesscss.org/">LESS</a> est une des briques qu&#8217;il manquait à <acronym title="Cascading Style Sheets">CSS</acronym>. Ce meta-langage apporte des fonctionnalités jusque là inédites telles que l&#8217;<strong>héritage</strong>, l&#8217;<strong>injection</strong> et les <strong>variables</strong>. <a href="http://leafo.net/lessphp/">lessphp</a> porte ces avancées en <acronym title="Pre-Hypertext Processing">PHP</acronym> et ajoute ses propres fonctionnalités.</p>
<p>Cet outil me paraît <strong>indispensable</strong> alors j&#8217;ai décidé de l&#8217;intégrer à WordPress : <a href="http://wordpress.org/extend/plugins/wp-less/"><acronym title="WordPress">WP</acronym>-LESS</a> est né.</p>
<p><img class="aligncenter size-full wp-image-1417" title="LESS CSS" src="http://case.oncle-tom.net/images/2009/08/less-logo.png" alt="LESS CSS" width="199" height="81" /></p>
<p><span id="more-1435"></span></p>
<h3>LESS en quelques mots (ou lignes de code)</h3>
<p>Pour mettre en exergue l&#8217;intérêt de LESS, je reprends un exemple officiel :</p>
<pre><code class="css">#defaults {
  @width: 960px;
  @color: black;
}
.article { color: #294366; }
.comment {
  width: #defaults[@width];
  color: .article['color'];
}</code></pre>
<p>Le source précédent utilise 3 principes :</p>
<ul>
<li>les <strong>variables</strong> (dont leur nom est préfixé par un @)</li>
<li>les <strong>namespaces</strong> (ici, #defaults) pour regrouper des propriétés</li>
<li>les <strong>accesseurs</strong> (pour obtenir la couleur de l&#8217;article au sein du commentaire)</li>
</ul>
<p>Une fois ce code compilé par LESS, la feuille de style générée se résume à ceci :</p>
<pre><code class="css">.article { color:#294366; }
.comment {
  width:960px;
  color:#294366;
}</code></pre>
<p>C&#8217;est simple et efficace. Surtout quand on sait que l&#8217;on peut effectuer des opérations mathématiques, y compris en utilisant les variables, la conception va se retrouver facilitée.</p>
<h3>L&#8217;intérêt de <acronym title="WordPress">WP</acronym>-LESS</h3>
<p><a href="http://wordpress.org/extend/plugins/wp-less/"><acronym title="WordPress">WP</acronym>-LESS</a> intègre le parseur <acronym title="Pre-Hypertext Processing">PHP</acronym>, <a href="http://leafo.net/lessphp/">phpless</a>, au sein de WordPress pour minimiser le travail à fournir.</p>
<p>Une fois activé, dès qu&#8217;il détecte un fichier comportant l&#8217;extension <code>.less</code>, il <strong>compilera automatiquement le fichier</strong> pour produire des <acronym title="Cascading Style Sheets">CSS</acronym> interprétables par les navigateurs Web. Pour des raisons de performances, cette compilation n&#8217;est effectuée que lorsque le fichier <code>.less</code> est modifié. Cela implique également qu&#8217;à chaque mise à jour de votre fichier <code>.less</code>, vous n&#8217;avez pas à vous soucier de compiler son équivalent <acronym title="Cascading Style Sheets">CSS</acronym>.</p>
<p>De nombreux <em>hooks</em> et <em>filtres</em> sont placées un peu partout dans le code pour permettre à tout développeur, créateur de thème ou bidouilleur de se fixer dessus sans avoir à modifier le code du plugin. Et dans les rares cas où ça ne suffirait pas, tout est extensible puisqu&#8217;il suffit d&#8217;hériter de l&#8217;objet WPLessPlugin pour parvenir à vos fins.<br />
Des tas de choses qu&#8217;on ne pourrait pas faire en simple PHP4 (message subliminal : WordPress doit abandonner PHP4).</p>
<p><acronym title="WordPress">WP</acronym>-LESS agit en toute <strong>transparence et simplicité</strong>.</p>
<a href="http://case.oncle-tom.net/images/2009/08/wp-less-repository.png"><img class="size-medium wp-image-1438" title="Arborescence du plugin WP-LESS" src="http://case.oncle-tom.net/images/2009/08/wp-less-repository-300x125.png" alt="Arborescence du plugin WP-LESS" width="300" height="125" /></a>
<h3>Quel avenir pour <acronym title="WordPress">WP</acronym>-LESS ?</h3>
<p>J&#8217;ai déjà en tête d&#8217;autres fonctions pour simplifier encore plus la vie :</p>
<ul>
<li>permettre l&#8217;<strong>intégration dans un thème</strong> en tant que dépendance externe pour permettre aux thémeurs de redistribuer <acronym title="WordPress">WP</acronym>-LESS sans avoir à activer le plugin</li>
<li>proposer des <em>helpers</em> pour ne pas avoir à passer par <em>wp_enqueue_stylesheet</em> (même si c&#8217;est la meilleure solution)</li>
<li>dissocier les fichiers <code>.less</code> des feuilles de style dans l&#8217;éditeur de thème avec une validation lors de l&#8217;enregistrement</li>
<li>afficher un <strong>tableau de bord</strong> montrant l&#8217;état des fichiers de cache tout en pouvant les purger</li>
</ul>
<p>Vous attendriez d&#8217;autres fonctionnalités de la part de ce plugin ?</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2009/less-css-wordpress-wp-less/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Affichage personnalisé de ses abonnés Feedburner</title>
		<link>http://case.oncle-tom.net/2009/affichage-personnalise-abonnes-feedburner/</link>
		<comments>http://case.oncle-tom.net/2009/affichage-personnalise-abonnes-feedburner/#comments</comments>
		<pubDate>Thu, 14 May 2009 05:00:23 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[awareness]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[wp-cron]]></category>
		<category><![CDATA[xml]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1359</guid>
		<description><![CDATA[Comment intégrer un compteur d'abonnés Feedburner sous forme textuelle avec WordPress ? En quelques lignes, nous allons planifier une récupération quotidienne de notre compteur d'abonnés et l'intégrer dans le thème graphique. Au menu : WP-Cron, Feedburner Awareness et SimpleXML (PHP 5).]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-thumbnail wp-image-1360" title="Compteur d'abonnés Feedburner au format texte" src="http://case.oncle-tom.net/images/2009/05/compteur-abonnes-feedburner-texte-138x76.png" alt="Compteur d'abonnés Feedburner au format texte" width="138" height="76" /></p>
<p>Qu&#8217;on se le dise : le compteur de lecteurs Feedburner par défaut est sympa mais <strong>s&#8217;intègre mal dans n&#8217;importe quel design de site Web</strong>. <a href="http://case.oncle-tom.net/2009/04/15/menage-printemps/">Lors de la refonte du thème graphique de ce blog</a>, j&#8217;ai eu envie de remettre mon compteur d&#8217;abonnés Feedburner mais sous forme de texte. Même si le chiffre indiqué peut se révéler inexact, j&#8217;estime que c&#8217;est un <strong>indicateur intéressant</strong> sur la consultation d&#8217;un flux. Je suis également convaincu qu&#8217;à partir d&#8217;un certain nombre de lecteurs, ça facilite la conversion : si le nombre est élevé, c&#8217;est que le site est bien  &#8230; donc je m&#8217;abonne.</p>
<p>Bref, j&#8217;ai voulu implémenter ça de <strong>manière propre et peu gourmande</strong> avec <a href="http://codex.wordpress.org/Category:WP-Cron_Functions"><acronym title="WordPress">WP</acronym>-Cron</a>, l&#8217;<acronym title="Application Programming Interface">API</acronym> <a href="http://code.google.com/intl/fr/apis/feedburner/awareness_api.html">Feedburner Awareness</a> et la classe <a href="http://fr.php.net/simplexml"><acronym title="Pre-Hypertext Processing">PHP</acronym> 5 SimpleXML</a>. Une poignée de lignes de code suffisent, pourquoi s&#8217;en priver ? <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-1359"></span></p>
<h3>Le besoin</h3>
<p>La plupart des exemples que l&#8217;on trouve sur le Web attaquent directement l&#8217;<acronym title="Application Programming Interface">API</acronym> Feedburner Awareness. Autrement dit, votre page ne s&#8217;affichera pas tant que l&#8217;<acronym title="Application Programming Interface">API</acronym> n&#8217;aura pas été appelée et son résultat interprété. Étant donné que cette valeur change 1 fois par jour, il vaut mieux aborder la chose différemment. C&#8217;est pourquoi je voulais :</p>
<ul>
<li>récupérer 1 à 2 fois par jour la valeur courante du nombre de lecteurs ;</li>
<li>accéder à cette valeur simplement depuis mes templates (avec un appel à get_option() par exemple).</li>
</ul>
<p><strong>On y gagne sur tous les fronts</strong> : on ne ralentit pas l&#8217;affichage côté utilisateur, l&#8217;information est récupérée en arrière-plan, nos templates graphiques restent simples.</p>
<h3>Activation du service Feedburner Awareness</h3>
<p>La première chose à faire est d&#8217;<strong>activer l&#8217;<acronym title="Application Programming Interface">API</acronym> Awareness pour votre flux</strong>. Cette <acronym title="Application Programming Interface">API</acronym> permet de récupérer des statistiques sur un flux Feedburner au format <acronym title="eXtensible Markup Language">XML</acronym>. On y retrouve entre autre le nombre de lecteurs. On peut obtenir ces informations pour la date courante, la veille ou une plage de jours par exemple.</p>
<p>C&#8217;est vraiment simple à utiliser, la <a href="http://code.google.com/intl/fr/apis/feedburner/awareness_api.html">documentation Feedburner Awareness</a> est complète dans son genre.</p>
<div id="attachment_1361" class="wp-caption aligncenter" style="width: 310px"><a href="http://case.oncle-tom.net/images/2009/05/feedburner-awareness-activation.png"><img class="size-medium wp-image-1361" title="Activation du service Feedburner Awareness" src="http://case.oncle-tom.net/images/2009/05/feedburner-awareness-activation-300x166.png" alt="Activation du service Feedburner Awareness" width="300" height="166" /></a><p class="wp-caption-text">Activation du service Feedburner Awareness</p></div>
<p><strong>Remarque</strong> : cette <acronym title="Application Programming Interface">API</acronym> s&#8217;active par flux Feedburner de manière individuelle et est désactivée par défaut.</p>
<h3>Extraction du nombre de lecteurs</h3>
<p>Dans un premier temps, on va <strong>récupérer le nombre de lecteurs pour son flux</strong>. On verra dans un second temps comment l&#8217;automatiser.</p>
<p>Le principe est simple : on appelle une <acronym title="Uniform Resource Identifier">URI</acronym> avec son identifiant de flux Feedburner (exemple dans mon cas : http://feeds.feedburner.com/LaCaseDeLoncTom). On lui spécifie 2 dates : la veille et l&#8217;avant-veille. Pourquoi ? Car les données de la veille ne sont pas toujours existantes : les compteurs sont actualisés à 11h heure française. L&#8217;idée est de pouvoir se mettre un nombre de lecteurs sous la dent.</p>
<pre><code class="php">define('FEEDBURNER_URI', 'LaCaseDeLoncTom');
function oncletom_update_feed_readers()
{
  $uri = sprintf('https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=%s&amp;dates=%s,%s',
    FEEDBURNER_URI,
    date('Y-m-d', strtotime('-2 day')),
    date('Y-m-d', strtotime('-1 day'))
  );
  $http = new WP_Http();
  $readers = (int)get_option('feed_readers');
  $response = $http-&gt;get($uri);
  $xml = new SimpleXMLElement(WP_Http::chunkTransferDecode($response['body']));
  $feed = (array)$xml-&gt;feed;
  foreach (array_reverse($feed['entry']) as $entry)
  {
    if ((int)$entry['circulation'])
    {
      $readers = (int)$entry['circulation'];
      update_option('feed_readers', $readers);
      break;
    }
  }
  return $readers;
}</code></pre>
<p>Quelques remarques :</p>
<ul>
<li>j&#8217;ai utilisé la classe  <code>WP_http</code> qui fournit une abstraction d&#8217;appel à des ressources distantes. C&#8217;est le plus propre pour fonctionner sur la majorité des installations ;</li>
<li>j&#8217;inverse le tableau des résultats car ils sont triés par ordre chronologique <em>croissant</em> par défaut  ; nous voulons l&#8217;information la plus fraîche d&#8217;abord ;</li>
<li>on aurait pu utiliser un paramètre de fonction pour fournir l&#8217;<acronym title="Uniform Resource Identifier">URI</acronym> du flux <em>mais</em> dans l&#8217;étape d&#8217;après, il se trouve qu&#8217;on ne pourra lui en passer &#8230; dommage ;</li>
<li>on aurait également pu remplacer la constante par un appel à un <code>get_option()</code> et pourquoi pas, récupérer l&#8217;ID depuis un réglage du plugin Feedburner FeedSmith.</li>
</ul>
<h3>Programmation d&#8217;une tâche planifiée avec <acronym title="WordPress">WP</acronym>-Cron</h3>
<p>On en arrive à la partie sympa : programmer cette récupération du nombre d&#8217;abonnés pour qu&#8217;on n&#8217;ait pas de travail manuel à faire. L&#8217;idéal est de placer ceci dans un plugin. Personnellement je l&#8217;ai inséré dans le <em>hook</em> <code>switch_theme()</code> de mon thème pour économiser un fichier/plugin.</p>
<pre><code class="php">//dans un fichier wp-content/plugins/oncletom-awareness-cron.php
/*
Plugin Name: Simple Feedburner Awareness
Description: Asynchroneous feed readers collector scheduled twice a day.
Author: Oncle Tom
Version: 1.0
Author URI: http://case.oncle-tom.net/
Plugin URI:
  This plugin is released under version 3 of the GPL:
http://www.opensource.org/licenses/gpl-3.0.html
*/
register_activation_hook(__FILE__, 'oncletom_awareness_cron_activate');
register_deactivation_hook(__FILE__, 'oncletom_awareness_cron_deactivate');
add_action('oncletom_cron_twicedaily_hook', 'oncletom_update_feed_readers');
function oncletom_awareness_cron_activate()
{
  add_option('feed_readers', 0, '', 'yes');
  wp_schedule_event(time(), 'twicedaily', 'oncletom_cron_twicedaily_hook');
}
function oncletom_awareness_cron_deactivate()
{
  delete_option('feed_readers');
  wp_clear_scheduled_hook('oncletom_cron_twicedaily_hook');
}</code></pre>
<p>Vous vous souvenez encore de notre fonction <code>oncletom_update_feed_readers()</code> ? Et bien on pourrait la rajouter dans ce plugin pour tout avoir au même endroit. L&#8217;organisation de votre code vous appartient <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Quoiqu&#8217;il en soit, une fois le plugin activé, <strong>tout est prê</strong>t : il ne reste qu&#8217;à intégrer le compteur d&#8217;abonnés dans le thème. C&#8217;est notre prochaine étape.<br />
Juste une remarque : la fonction <code>wp_schedule_event()</code> prend comme dernier argument un nom de <em>hook</em> et non un nom de fonction.</p>
<h3>Intégration dans le thème</h3>
<p>C&#8217;est la partie la plus simple et pour cause, un simple appel à <code>get_option('feed_readers')</code> nous retourne le nombre d&#8217;abonnés. On ne pouvait pas faire plus rapide <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<pre><code class="php">&lt;p&gt;J'ai &lt;?php echo get_option('feed_readers') ?&gt; abonnés&lt;/p&gt;</code></pre>
<h3>Conclusion</h3>
<p><strong>WordPress fournit tous les mécanismes</strong> pour accéder aisément à des données de manière asynchrone. Il ne nous a pas coûté grand chose de collecter le flux <acronym title="eXtensible Markup Language">XML</acronym> et de l&#8217;enregistrer. En le faisant ainsi en arrière plan, on évite toute gêne pour l&#8217;utilisateur et tout traitement superflu exécuté en affichage.</p>
<p>Assez étonnamment, je n&#8217;ai croisé <a href="http://wordpress.org/extend/plugins/tags/awareness">aucune extension dans le catalogue WordPress</a>. J&#8217;espère que ça vous dépannera et que votre thème graphique appréciera !<br />
<strong>Mise à jour</strong> : aucun plugin n&#8217;était tagué <em>awareness</em> ; <a href="http://wordpress.org/extend/plugins/feedburnercount/">FeedBurnerCount</a>, <a href="http://wordpress.org/extend/plugins/feed-subscriber-stats/">Feed Subscriber Stats</a> et <a href="http://wordpress.org/extend/plugins/feedburner-text-counter-v10/">Feedburner Text Count</a> produisent très probablement le même résultat que le contenu de cet article.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2009/affichage-personnalise-abonnes-feedburner/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ménage de printemps</title>
		<link>http://case.oncle-tom.net/2009/menage-printemps/</link>
		<comments>http://case.oncle-tom.net/2009/menage-printemps/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 18:06:59 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Personnel]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blueprint]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css2]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[performances]]></category>
		<category><![CDATA[png]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[yslow]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1345</guid>
		<description><![CDATA[J'avais besoin de changer de thème graphique ! Découvrez les besoins, les critères d'exigence et de qualité. Je présente également la vie d'un intégrateur sans compatibilité avec Internet Explorer 6, mes déconvenues avec WP Cron et les manipulations de WordPress pour parvenir à mes fins.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-thumbnail wp-image-1347" title="WordPress Logo" src="http://case.oncle-tom.net/images/2009/04/wordpress-badge-138x138.png" alt="WordPress Logo" width="138" height="138" /></p>
<p>Je me décide à passer un coup de peinture sur ce blog quasiment 2 ans après le <a href="http://case.oncle-tom.net/2007/08/15/css-summer-refresh-2007/"><acronym title="Cascading Style Sheets">CSS</acronym> Summer Refresh</a> organisé par <a href="http://alsacreations.com/">Alsacréations</a>. À vrai dire, j&#8217;avais ce projet dans les cartons depuis septembre 2008 mais le plus difficile a été de trouver le talent graphique. C&#8217;était également l&#8217;occasion de dire au revoir aux navigateurs Web de seconde zone, à savoir Internet Explorer 7 et moins.</p>
<p><span id="more-1345"></span></p>
<h3>Le besoin</h3>
<p>Mon besoin était le suivant :</p>
<ul>
<li><strong>Thème graphique</strong>
<ul>
<li>durable et peu lassant</li>
<li>usage de transparence</li>
<li>toujours sur des tons marrons</li>
<li>inspire la modernité tout comme le côté rustique et soucieux de la nature</li>
<li>structure en grille pour intégrer avec <a href="http://blueprintcss.org/">Blueprint</a></li>
</ul>
</li>
<li><strong>Fonctionnalités</strong>
<ul>
<li>intégration d&#8217;un <em>lifestream</em> (intégré entre temps)</li>
<li>intégration de <a href="http://feedburner.com/">Feedburner</a> via son <a href="http://code.google.com/intl/fr/apis/feedburner/awareness_api.html"><acronym title="Application Programming Interface">API</acronym> Awareness</a></li>
<li>intégration d&#8217;un bandeau <a href="http://flickr.com/">Flickr</a> qui s&#8217;étend sur toute la largeur de l&#8217;écran, peu importe la résolution employée</li>
<li>utilisation du blog comme vitrine : suppression de ma dernière page <acronym title="HyperText Markup Language">HTML</acronym> manuelle (autrefois accessible sur <a href="http://oncle-tom.net/">oncle-tom.net</a>)</li>
</ul>
</li>
<li><strong>Compatibilité</strong>
<ul>
<li>navigateurs modernes &#8230; c&#8217;est à dire rien en dessous d&#8217;Internet Explorer 8</li>
<li>intégration avec <acronym title="HyperText Markup Language">HTML</acronym> 5</li>
<li>pas d&#8217;utilisation de <acronym title="Graphics Interchange Format">GIF</acronym> mais de <acronym title="Portable Network Graphics">PNG</acronym> 6 et <acronym title="Portable Network Graphics">PNG</acronym> 24</li>
</ul>
</li>
<li><strong>Autre</strong>
<ul>
<li>soucis de performance (peu d&#8217;éléments graphiques, utilisation des <em>sprites</em>)</li>
</ul>
</li>
</ul>
<p>Finalement c&#8217;est <a href="http://leslyg.com/">Lesly</a> qui s&#8217;est chargé de la création graphique. Vous pouvez d&#8217;ailleurs consulter la <a href="http://leslyg.com/work/blog-de-thomas-parisot-oncle-tom/">maquette graphique originale sur son portfolio</a>. Quant à moi, j&#8217;ai réalisé toute l&#8217;intégration <acronym title="Cascading Style Sheets">CSS</acronym>/<acronym title="HyperText Markup Language">HTML</acronym> dans WordPress.</p>
<h3>L&#8217;intégration</h3>
<p>Tout d&#8217;abord, qu&#8217;est ce qui a changé par rapport à la maquette ?</p>
<ul>
<li><strong>les polices de caractère</strong> : hormis le titre, seules des polices standards ont été employées. J&#8217;attendrai le support des polices personnalisées en <acronym title="Cascading Style Sheets">CSS</acronym> 3 à moins de partir sur une solution à base de <acronym title="Scalable Vector Graphics">SVG</acronym> (encore que j&#8217;ai des doutes sur l&#8217;accessibilité d&#8217;une telle méthode) ;</li>
<li><strong>moins d&#8217;éléments graphiques</strong> : les punaises, les effets papiers ont été supprimés. Rien que le papier et le scotch de la partie &laquo;&nbsp;À propos&nbsp;&raquo; pesaient plus de 60Ko ;</li>
<li><strong>abandon temporaire du <em>featured content</em></strong> : les solutions actuelles étaient trop lourdes et j&#8217;étais trop impatient pour passer quelques heures de plus &#8230; donc c&#8217;est temporaire <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li>l&#8217;<strong>ajout des pages en lieu et place du fil d&#8217;ariane</strong> : j&#8217;en avais besoin pour présenter différents contenus statiques ;</li>
<li><strong>le pied de page</strong> : peu de widgets WordPress offrent un degré de personnalisation suffisant pour arriver à ce résultat. C&#8217;est donc temporisé là aussi en attendant de trouver chaussure à mon pied <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
<div id="attachment_1346" class="wp-caption aligncenter" style="width: 160px"><a href="/images/2009/04/caseoncle-tomnet-oncletom-wood.png"><img class="size-medium wp-image-1346" title="caseoncle-tomnet-oncletom-wood" src="http://case.oncle-tom.net/images/2009/04/caseoncle-tomnet-oncletom-wood-150x300.png" alt="Aperçu pleine page" width="150" height="300" /></a><p class="wp-caption-text">Aperçu pleine page</p></div>
<p>Pour le reste je me suis fait plaisir avec notamment l&#8217;utilisation de coins arrondis (<em>border-radius</em>) basés sur les implémentations de Gecko et Webkit. Désolé pour les utilisateurs d&#8217;autres navigateurs car j&#8217;en ai usé et abusé afin d&#8217;éviter l&#8217;utilisation d&#8217;images.</p>
<p>J&#8217;ai également joué avec l&#8217;<strong><acronym title="Application Programming Interface">API</acronym> de WordPress</strong> pour générer les vignettes des articles. Je sais bien qu&#8217;on peut définir des tailles d&#8217;images mais ça ne vaut que pour les médias nouvellement mis en ligne. J&#8217;en ai profité pour n&#8217;afficher dans le listing que l&#8217;extrait du billet. Pas l&#8217;intro, seulement l&#8217;extrait (<em>excerpt</em>). J&#8217;ai lu récemment un article qui parlait de la chose et ça m&#8217;a paru plus approprié. Je peux désormais écrire le texte qui me convient pour attirer la lecture vers un article sans pour autant que ça ait de répercution sur son contenu une fois affiché en pleine page.</p>
<p>Je suis en revanche toujours dubitatif sur l&#8217;<acronym title="Application Programming Interface">API</acronym> de <acronym title="WordPress">WP</acronym> Cron : ma tâche a beau être enregistrée et planifiée, j&#8217;ai l&#8217;impression qu&#8217;elle ne s&#8217;exécute jamais &#8230; contrairement aux recherches de mises à jour de plugins &amp; cie. <span style="text-decoration: line-through;">Quelqu&#8217;un a déjà joué avec et rencontré pareil problème ?</span><br />
<strong>Mise à jour</strong> : j&#8217;ai résolu le problème et détaillé la marche à suivre dans l&#8217;article <a href="http://case.oncle-tom.net/2009/05/14/affichage-personnalise-abonnes-feedburner/">affichage personnalisé de ses lecteurs Feedburner</a>. Je planifiais une fonction et non un <em>hook</em>. Cela fonctionnait mais ne produisait fatalement pas de résultat <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Au final je n&#8217;ai même pas eu à placer la moindre ligne de JavaScript : tout est fait à partir de sélecteurs <acronym title="Cascading Style Sheets">CSS</acronym>. Mon seul regret : l&#8217;absence de sélecteur adjacent &#8230; &laquo;&nbsp;précédent&nbsp;&raquo;. Pour le menu du haut, je voulais pouvoir styler les éléments de menus ayant comme élément suivant une liste d&#8217;élément (<code>&lt;ul&gt;</code>).</p>
<h3>Au final</h3>
<p>J&#8217;ai mis à peu près 2 jours pour tout intégrer et optimiser. Je n&#8217;ai pas encore tenté l&#8217;optimisation à coup de <acronym title="Portable Network Graphics">PNG</acronym> 8 grâce aux quelques Ko gagnés avec <a href="http://pmt.sourceforge.net/pngcrush/">pngcrush</a>. Il faudrait également que je réunisse quelques images dans un seul et même sprite pour gagner encore quelques dizièmes de seconde en temps de chargement.</p>
<div id="attachment_1349" class="wp-caption aligncenter" style="width: 414px"><img class="size-full wp-image-1349" title="Rapport YSlow" src="http://case.oncle-tom.net/images/2009/04/caseoncle-tomnet-yslow.png" alt="Rapport YSlow" width="404" height="398" /><p class="wp-caption-text">Rapport YSlow</p></div>
<p>J&#8217;en ai profité pour tester l&#8217;utilisation de <em>mod_expires</em> et <em>mod_gzip</em> chez OVH en mutualisé (avant de tout migrer sur serveur dédié) : ça marche plutôt très bien. Si ça vous intéresse, je peux en faire un billet dédié. D&#8217;ici là, n&#8217;hésitez pas à bouquiner <a href="http://case.oncle-tom.net/2008/07/15/high-performance-web-sites/">High Performances Web Sites</a> qui reste une référence en la matière. J&#8217;attends d&#8217;ailleurs sa suite avec impatience : <em>Even Faster Web Sites: Essential Knowledge for Frontend Engineers</em>.</p>
<p>Quoiqu&#8217;il en soit, le fait d&#8217;avoir eu la pleine utilisation des sélecteurs <acronym title="Cascading Style Sheets">CSS</acronym> a été géniale : la vie est grandement facilitée. <em>inline-block</em> évite de nombreuses bidouilles à base de flottants. J&#8217;ai hâte qu&#8217;une version de <em>Blueprint</em> sorte en se basant uniquement sur les sélecteurs avancés et non des flottants pour disposer de mises en forme plus complexes tout en étant facile d&#8217;accès.</p>
<p>Si vous rencontrez des problèmes, surtout n&#8217;hésitez pas à les signaler, par le <a href="#respond">biais des commentaires</a> ou par <a href="/contact/">email</a> <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>En attendant, je retourne sur mon <a href="http://case.oncle-tom.net/2009/02/24/faire-part-de-naissance/">projet éprouvant du moment</a> !</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2009/menage-printemps/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Ajouter TinyMCE dans un plugin WordPress</title>
		<link>http://case.oncle-tom.net/2009/ajouter-tinymce-plugin-wordpress/</link>
		<comments>http://case.oncle-tom.net/2009/ajouter-tinymce-plugin-wordpress/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 06:00:39 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tinymce]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1297</guid>
		<description><![CDATA[J&#8217;ai eu besoin récemment d&#8217;inclure un éditeur visuel dans un plugin WordPress. Je pensais que c&#8217;était une tâche aisée sans chercher sur Google : il n&#8217;y avait qu&#8217;à faire comme les développeurs de WordPress ! J&#8217;ai pensé à tort et ça m&#8217;a confirmé une fois de plus que le code source de WordPress était un [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://case.oncle-tom.net/images/2009/04/wordpress-badge.png"><img class="aligncenter size-thumbnail wp-image-1347" title="WordPress Logo" src="http://case.oncle-tom.net/images/2009/04/wordpress-badge-138x138.png" alt="WordPress Logo" width="138" height="138" /></a></p>
<p>J&#8217;ai eu besoin récemment d&#8217;inclure un éditeur visuel dans un plugin WordPress. Je pensais que c&#8217;était une tâche aisée sans chercher sur Google : il n&#8217;y avait qu&#8217;à faire comme les développeurs de WordPress !</p>
<p>J&#8217;ai pensé à tort et ça m&#8217;a confirmé une fois de plus que le code source de WordPress était un joyeux bazar.<br />
<span id="more-1297"></span></p>
<h3>Le besoin</h3>
<p>Mon besoin était tout bête : sur une seule page de mon plugin, j&#8217;avais besoin de transformer un bête champ texte en éditeur avancé avec possibilité d&#8217;uploader des images et tout ça.</p>
<p>Avec ce simple besoin, j&#8217;ai cependant constaté :</p>
<ol>
<li>qu&#8217;il était <strong>pénible</strong> de remonter le cheminement logique de l&#8217;éditeur jusqu&#8217;à l&#8217;inclusion des scripts</li>
<li>qu&#8217;il n&#8217;y a <strong>pas de façon standard</strong> d&#8217;ajouter l&#8217;éditeur : il y a bien une fonction <code>wp_tiny_mce</code> mais elle ne fait pas tout &#8230; c&#8217;est à dire que sans inclure ses dépendances (non documentées), cette fonction n&#8217;est d&#8217;aucune utilité</li>
<li>qu&#8217;on trouve <strong>à boire et à manger</strong> dans le code de WordPress. Pour le <cite>code is poetry</cite>, on est plutôt proche du SMS kikoololesque</li>
</ol>
<p>Après avoir trouvé ma solution, je suis cependant tombé sur un <a href="http://blog.zen-dreams.com/fr/2008/11/06/how-to-include-tinymce-in-your-wp-plugin/">article expliquant comment inclure TinyMCE dans WordPress</a>. Elle est juste mais nous verrons que seule la moitié du chemin a été faite avec.</p>
<h3>La solution</h3>
<pre><code class="php">&lt;?php
add_action('admin_menu', 'include_tinymce');
function include_tinycme()
{
  add_action('admin_head', 'wp_tiny_mce');
  wp_enqueue_script('jquery-ui-core');
  wp_enqueue_script('jquery-ui-tabs');
  wp_enqueue_script('editor');
  wp_enqueue_script('media-upload');
  add_thickbox();
}</code></pre>
<p>Plusieurs remarques par rapport à ce code :</p>
<ul>
<li><strong>Le choix de l&#8217;action</strong><br />
Le mien s&#8217;est porté sur <em>admin_menu</em>. Vous pourriez en choisir une autre, du moment qu&#8217;elle s&#8217;exécute <em>avant</em> admin_head. J&#8217;ai choisi celle-là parce que c&#8217;est là que j&#8217;y construis les menus de l&#8217;administration : WordPress est initialisé et n&#8217;a pas encore été affiché.</li>
<li><strong>Le choix wp_enqueue_script</strong><br />
J&#8217;aurais pu caller cette fonction en tant que filtre de <code>admin_head</code> et utiliser la fonction <code>print_script</code> MAIS je soupçonne cette dernière fonction de ne pas vérifier si un autre script du même nom a été inclus.<br />
J&#8217;ai choisi de ne pas créer de conflit : <code>wp_enqueue_script</code> ne chargera qu&#8217;1 fois et 1 seule le script nommé. Pas de chichi.</li>
<li><strong>L&#8217;inclusion de l&#8217;éditeur</strong><br />
Pour afficher l&#8217;éditeur, il suffira d&#8217;appeler la fonction <code>the_editor()</code> en lieu et place de son <code>textarea</code>. Vous noterez toutefois que vous serez obligé(e)s de nommer l&#8217;éditeur <em>content</em> sous peine de devoir ajouter quelques filtres supplémentaires.</li>
</ul>
<p>Après à vous de vous débrouiller avec l&#8217;architecture de votre plugin. Personnellement j&#8217;ai tout basculé dans des classes depuis un bon moment pour éviter tout conflit de nom.</p>
<h3>La solution optimisée</h3>
<p>Cependant ne crions pas victoire si vite : avec ce qu&#8217;on a fait, nous avons juste réussi à inclure TinyMCE sur <em>toutes</em> les pages de l&#8217;admin WordPress. Ce n&#8217;est pas ce que je recommanderai pour deux raisons :</p>
<ol>
<li>le respect des performances utilisateurs : charger 150Ko de JavaScript pour rien sur une page sans TinyMCE, c&#8217;est du gâchis</li>
<li>on ne fait pas une généralité pour une exception</li>
</ol>
<p>Heureusement pour nous WordPress est <em>bien fichu</em> car il nous fournit 2 variables globales (*hm*) d&#8217;exception :</p>
<ul>
<li><strong>$plugin_page</strong><br />
Cette variable contient le nom de la page renseignée par les méthodes <code>add_management_page()</code> et <code>add_options_page()</code>. On aurait pu passer directement par <a href="http://codex.wordpress.org/Plugin_API/Action_Reference">admin_print_script*</a> mais il faisait flemme d&#8217;ajouter une fonction de plus.<br />
Exemple :</p>
<pre><code class="php">&lt;?php
add_management_page('Titre', 'Label', 8, 'test_management_page', 'mon_callback');
//$plugin_page vaudra 'test_management_page'</code></pre>
</li>
<li><strong>$pagenow</strong><br />
Cette variable contient le nom du fichier actuellement exécuté.<br />
Si vous vous trouvez sur <kbd>wp-admin/tools.php?page=test_management_page</kbd>, <code>$pagenow</code> vaudra <code>tools.php</code></li>
</ul>
<p>Avec ces deux variables, on est capable de charger ce qu&#8217;on veut, où on veut et quand on veut.</p>
<p>Au final, ça nous donnerait ceci :</p>
<pre><code class="php">&lt;?php
add_action('admin_menu', 'include_tinymce');
function include_tinycme()
{
  global $plugin_page;
  if ($plugin_page === 'test_management_page')
  {</code><code class="php">
    add_action('admin_head', 'wp_tiny_mce');
    wp_enqueue_script('jquery-ui-core');
    wp_enqueue_script('jquery-ui-tabs');
    wp_enqueue_script('editor');
    wp_enqueue_script('media-upload');
    add_thickbox();</code>
<code class="php">  }
}</code></pre>
<p>Là on a bien terminé le travail.</p>
<h3>Conclusion</h3>
<p>Il n&#8217;y a au final pas grand chose à chose à ajouter pour disposer de TinyMCE. Encore faut-il le savoir.</p>
<p>On peut cependant regretter le manque de flexibilité de cette manipulation :</p>
<ul>
<li>j&#8217;ai definé la liste des fichiers en cherchant les noms de fonctions JavaScript manquantes (merci Firebug et l&#8217;affichage des exceptions en console)</li>
<li>la liste des dépendances de <code>wp_enqueue_script</code> n&#8217;est absolument pas complète : <em>editor</em> devrait appeler <em>wp_tiny_mce</em> et <em>media-upload</em> (voire <em>jquery-ui-*</em>)</li>
</ul>
<p>Un jour WordPress nettoiera son code pour faciliter la maintenance &#8230;</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2009/ajouter-tinymce-plugin-wordpress/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>WordPress en tant que dépendance SVN</title>
		<link>http://case.oncle-tom.net/2008/wordpress-svn-external/</link>
		<comments>http://case.oncle-tom.net/2008/wordpress-svn-external/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 06:00:59 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[bonne pratique]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codex]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[wordpress mu]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1237</guid>
		<description><![CDATA[Mettre à jour WordPress était pénible jusqu&#8217;à l&#8217;arrivée de la version 2.7. On bénéficie désormais de la mise à jour automatique : un clic, ça télécharge et ça déploie. Il existe cependant une méthode alternative reposant sur Subversion (SVN). C&#8217;est la méthode idéale pour tout développeur WordPress ou gestionnaire de blogs. C&#8217;est celle que j&#8217;emploie [...]]]></description>
			<content:encoded><![CDATA[<p>Mettre à jour WordPress était pénible jusqu&#8217;à l&#8217;arrivée de la version 2.7. On bénéficie désormais de la mise à jour automatique : un clic, ça télécharge et ça déploie.</p>
<p><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="" width="273" height="66" /></p>
<p>Il existe cependant une <strong>méthode alternative reposant sur Subversion</strong> (<acronym title="Subversion">SVN</acronym>). C&#8217;est la méthode idéale pour tout développeur WordPress ou gestionnaire de blogs. C&#8217;est celle que j&#8217;emploie depuis la version 2.6 grâce notamment à la constante WP_CONTENT.</p>
<p>Explications et application concrète.</p>
<p><span id="more-1237"></span></p>
<p>Avant toute chose, sachez que <strong>ce tutorial est optimisé pour les personnes qui versionnent entièrement leur projet</strong>. Il n&#8217;est pas question ici d&#8217;avoir une arborescence libre et de procéder à des <em>checkout</em> un peu partout. C&#8217;est possible mais pas du plus grand intérêt.</p>
<p>L&#8217;avantage évident ici est de pouvoir déployer son blog n&#8217;importe où en un rien de temps.</p>
<h3>Structure des fichiers</h3>
<p>Installer WordPress en tant que dépendance <acronym title="Subversion">SVN</acronym> revient à mélanger 2 techniques :</p>
<ul>
<li><a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">Installer WordPress dans son propre répertoire<br />
</a></li>
<li><a href="http://codex.wordpress.org/Installing_WordPress_With_Clean_Subversion_Repositories">Installer WordPress proprement depuis <acronym title="Subversion">SVN</acronym></a></li>
</ul>
<p>Je suis pénible donc je n&#8217;ai pas spécialement envie de modifier un fichier <em>core</em> ou autre chose que <em>wp-config.php</em>. Tout le contraire de ce qu&#8217;indique la première méthode.</p>
<p>La seconde explication m&#8217;a toutefois posé légèrement problème puisqu&#8217;un peu brutale et posant soucis chez OVH.</p>
<img class="size-full wp-image-1254" title="Arborescence fichier avec WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-basic-filetree.png" alt="Arborescence fichier avec WordPress SVN" width="329" height="298" />
<p>Celles et ceux qui voient la capture d&#8217;écran ci-dessus peuvent constater que <em>tout WordPress</em> a été déplacé dans un sous-répertoire <em>wordpress</em> au même niveau que wp-content.<br />
On ne garde à la racine que le fichier <em>.htaccess</em> et <em>wp-config.php</em>.</p>
<p>Sur le répertoire racine, j&#8217;ai appliqué ces propriétés pour WordPress 2.7 :</p>
<ul>
<li><kbd>svn:ignore</kbd> :<kbd><br />
</kbd></p>
<pre><code class="svn">wp-config.php</code></pre>
</li>
<li><kbd>svn:externals</kbd> :<kbd><br />
</kbd></p>
<pre><code class="svn">wordpress http://svn.automattic.com/wordpress/branches/2.7</code></pre>
</li>
</ul>
<p>Je ne versionne volontairement pas le fichier wp-config.php car c&#8217;est le seul fichier susceptible de changer d&#8217;une instance à une autre. Je le récupère depuis wordpress/wp-config-sample.php et je le personnalise selon mes besoins.<br />
Et puis versionner des mots de passe &#8230; qui y tient ?</p>
<h3>Configuration</h3>
<p>Après cette restructuration, on aura toutefois besoin de configurer 2-3 bricoles. Vraiment rien de méchant promis.</p>
<h4>Le .htaccess</h4>
<p>Voici ma configuration. Elle peut être aisément déportée dans votre déclaration de <em>Virtual Host</em> pour des raisons de performance. Sur un serveur mutualisé vous n&#8217;avez en général pas accès à ce dernier type de configuration.</p>
<pre><code>&lt;IfModule mod_rewrite.c&gt;
Options -Multiviews -Indexes +FollowSymlinks
RewriteEngine On
RewriteBase /
# Moving to dependency
RewriteRule ^(index.php|wp-[a-z0-9-]+\.php|xmlrpc.php)?$ wordpress/$1 [L]
RewriteRule ^(wp-admin|wp-includes)/(.*)$ wordpress/$1/$2 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . wordpress/index.php [L]
&lt;/IfModule&gt;
# BEGIN WordPress
# END WordPress</code></pre>
<p>Ce fichier est très inspiré de la <a href="http://codex.wordpress.org/Installing_WordPress_With_Clean_Subversion_Repositories">configuration <acronym title="Subversion">SVN</acronym> proposée sur le Codex WordPress</a>. Seulement voilà, cette renvoie tout sur <em>index.php</em> &#8230; et omet ainsi tous les accès aux fichiers situés à la racine, avec entre autre :</p>
<ul>
<li>wp-cron.php</li>
<li>wp-link-opml.php</li>
<li>wp-trackback.php</li>
<li>xmlrpc.php</li>
</ul>
<p>Je vous fais grâce des contrôleurs de flux (Atom, <acronym title="Really Simple Syndication">RSS</acronym> &amp; cie) et des appels en directs à <em>index.php</em> effectués par certains plugins.</p>
<p>Donc non on ne peut pas vraiment se passer de ces fichiers. D&#8217;où ces 2 règles :</p>
<ul>
<li>
<pre><code>RewriteRule ^(index.php|wp-[a-z0-9-]+\.php|xmlrpc.php)?$ wordpress/$1 [L]
</code></pre>
<p>On capte tous les fichiers <acronym title="Pre-Hypertext Processing">PHP</acronym> (les contrôleurs) originellement situés à la racine de WordPress.</li>
<li>
<pre><code>RewriteRule ^(wp-admin|wp-includes)/(.*)$ wordpress/$1/$2 [QSA,L]</code></pre>
<p>Et là c&#8217;est pour le confort de conserver les adresses initiales &#8230; mais aussi pour éviter de modifier un bout de paramétrage dans l&#8217;admin. Le jour où vous décidez de rebasculer à l&#8217;ancien système, ça se fera sans douleur <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>Enfin, pourquoi avoir poussé les commentaires WordPress vers le bas ? Tout simplement pour <strong>éviter que nos règles personnalisées soient écrasées par WordPress</strong> lors d&#8217;une mise à jour des permaliens. Nos règles primeront toujours ainsi.</p>
<h4>Le fichier wp-config.php</h4>
<p>Dans le fichier <em>wp-config.php</em>, nous n&#8217;allons rien modifier. Nous allons juste ajouter forcer 2 paramètres. Ils indiqueront à WordPress où se trouve le véritable répertoire <em>wp-content</em> (renommable mais je ne jouerai pas avec).</p>
<img class="size-full wp-image-1262" title="wp-config.php modifié pour WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-wpconfig.png" alt="wp-config.php modifié pour WordPress SVN" width="600" height="266" />
<h4>Le blog</h4>
<p>Bon j&#8217;ai menti un peu toute à l&#8217;heure en indiquant qu&#8217;on ne toucherait qu&#8217;à <em>wp-config.php</em>. Cependant la modification est on ne peut plus mineure et ne concerne que l&#8217;upload de medias.</p>
<p>En effet si on ne touche pas à l&#8217;emplacement des fichiers envoyés, WordPress considère qu&#8217;ils sont uploadés dans wordpress/wp-content/uploads. C&#8217;est fort gênant mais heureusement, en préfixant le chemin par ../ ou en tapant un chemin absolu tout rentrera dans l&#8217;ordre.</p>
<img class="size-full wp-image-1261" title="Correction de chemin pour WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-file-uploads-fix.png" alt="Correction de chemin pour WordPress SVN" width="600" height="74" />
<p>À noter qu&#8217;il s&#8217;agit du <strong>seul paramétrage hors d&#8217;un fichier</strong>. Si j&#8217;avais pu m&#8217;en passer je l&#8217;aurais fait.</p>
<h3>Dépendance <acronym title="Subversion">SVN</acronym> pour la traduction</h3>
<p>C&#8217;est en tombant sur un autre <a href="http://sunfox.org/blog/2007/05/28/installation-svn-de-wordpress-et-de-ses-plugins/">article traitant de svn:externals pour WordPress</a> que j&#8217;ai été interpelé sur la prise en charge des langues via <acronym title="Subversion">SVN</acronym> également.<br />
Le système n&#8217;est pas parfait puisqu&#8217;on ne peut gérer qu&#8217;une seule langue par ce biais là. Ça ne conviendra donc pas aux blogs multilingues.</p>
<img class="size-full wp-image-1260" title="Dépendance SVN pour les traductions WordPress" src="http://case.oncle-tom.net/images/2008/12/wordpress-i18n-svn-external.png" alt="Dépendance SVN pour les traductions WordPress" width="550" height="104" />
<p>La technique consiste à transformer <code>wp-content/languages</code> en <kbd>svn:externals</kbd>.<br />
Ça donnerait ceci pour la version française de WordPress 2.7, au niveau du <kbd>svn:externals</kbd> du répertoire <code>wp-content</code> :</p>
<pre><code class="svn">languages http://svn.automattic.com/wordpress-<acronym title="internationalisation">i18n</acronym>/fr_FR/branches/2.7/messages/</code></pre>
<p><strong>Simple et efficace</strong> mais ça reste encore de la bricole.</p>
<h3>Cas particulier : plugins et <acronym title="internationalisation">i18n</acronym></h3>
<p>Je vous expose le problème mais malheureusement vous ne pourrez pas y faire grand chose. Par contre ami développeurs, pour rendre votre code de plugin 100% portable, merci de prendre note <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Le chargement des traductions s&#8217;effectue à l&#8217;aide de la fonction load_plugin_textdomain(). Elle prenait seulement 2 paramètres jusqu&#8217;à l&#8217;arrivée de WordPress 2.6. Ça n&#8217;a pas été crié sur les toits mais elle prend désormais 3 &#8230; et c&#8217;est du 3ème argument qu&#8217;il faut utiliser désormais :</p>
<ol>
<li><code class="php">$domain</code> : l&#8217;espace de nom des traduction (inchangé)</li>
<li><code class="php">$abs_rel_path</code> : chemin relatif par rapport à l&#8217;emplacement de WordPress (déprécié, on y mettait <code>PLUGINDIR.'/'.dirname(plugin_basename(__FILE__))</code> en général)</li>
<li><code class="php">$plugin_rel_path</code> :  chemin relatif par rapport à l&#8217;emplacement des plugins (c&#8217;est qui nous intéresse ; <code>dirname(plugin_basename(__FILE__))</code> nous suffira désormais)</li>
</ol>
<p>Vous trouverez un <a href="http://codex.wordpress.org/Writing_a_Plugin#Internationalizing_Your_Plugin">exemple sur le Codex, du côté de l&#8217;internationalisation des plugins</a>.<br />
Un exemple de code pérenne :</p>
<pre><code class="php">load_plugin_textdomain('votreplugin', dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));</code></pre>
<p>Et si jamais vous utilisez votre plugin en lien symbolique ça ne fonctionnera pas &#8230; mais on s&#8217;éloigne du sujet <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Et pour WordPress Mu ?</h3>
<p>Je ne m&#8217;attarderai pas dessus mais les manipulations sont sensiblement les mêmes. Je n&#8217;ai pas encore eu l&#8217;occasion d&#8217;essayer mais j&#8217;ose imaginer qu&#8217;il n&#8217;y a pas tant de différences que ça <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Conclusion</h3>
<p>Le jour où vous souhaitez migrer vers une autre version majeure de WordPress, c&#8217;est simple :<strong> il suffit de changer les externals vers le tag adéquat</strong>.</p>
<p>Pourquoi ne pas utiliser le <em>trunk</em> directement me demanderez-vous ? Le trunk de WordPress est plutôt instable puisque c&#8217;est là que se construit la prochaine version de manière systématique. L&#8217;utilisation des <strong>branches permet de bénéficier des correctifs</strong> sans avoir à modifier le moindre external.<br />
Si vous avez un grand besoin de stabilité, alors utilisez les <em>tags</em> qui sont en principe figés.</p>
<p>On remarquera aussi que malgré son âge, <strong>WordPress commence à peine à proposer des solutions d&#8217;industrialisation</strong>.<br />
Les liens symboliques sont en effet très mal gérés. Tentez d&#8217;utiliser un seul répertoire source pour plusieurs blogs avec des liens symboliques et tout s&#8217;effondre.</p>
<p>La preuve en est aussi avec le <strong>manque de ressources disponibles sur le Web</strong> et traitant ce sujet. Ça m&#8217;étonnerait d&#8217;être le premier à vouloir déployer du WordPress via <acronym title="Subversion">SVN</acronym>.<br />
Les choses s&#8217;améliorent mais pour le côté <cite>code is poetry</cite>, on en est encore loin.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/wordpress-svn-external/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Plugin WordPress Amazon Widgets Shortcodes</title>
		<link>http://case.oncle-tom.net/2008/plugin-wordpress-amazon-widgets-shortcodes/</link>
		<comments>http://case.oncle-tom.net/2008/plugin-wordpress-amazon-widgets-shortcodes/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 05:00:44 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[shortcodes]]></category>
		<category><![CDATA[tinymce]]></category>
		<category><![CDATA[widgets]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1123</guid>
		<description><![CDATA[J&#8217;ai publié il y a quelques jours la version 1.2 du plugin Amazon Widgets Shortcodes. Cette version suit plusieurs autres publications plus intimistes, à des fins de tests grandeur nature. Ce fût en tous cas suffisant pour commencer à attirer l&#8217;attention de traducteurs. Concrètement, ce plugin facilite la monétisation des blogs WordPress en évitant de [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1140" title="Amazon Associates" src="http://case.oncle-tom.net/images/2008/09/amazon-associates.gif" alt="" width="222" height="36" /></p>
<p>J&#8217;ai publié il y a quelques jours la version 1.2 du plugin <a href="http://wordpress.org/extend/plugins/amazon-widgets-shortcodes/">Amazon Widgets Shortcodes</a>. Cette version suit plusieurs autres publications plus intimistes, à des fins de tests grandeur nature. Ce fût en tous cas suffisant pour commencer à attirer l&#8217;attention de traducteurs.</p>
<p>Concrètement, ce plugin <strong>facilite la monétisation des blogs WordPress</strong> en évitant de copier du <acronym title="HyperText Markup Language">HTML</acronym> fourni par Amazon. Les widgets Amazon s&#8217;intègrent du coup par le biais de petits raccourcis textuels, les <a href="http://codex.wordpress.org/Shortcode_API">shortcodes</a>.</p>
<p>Présentation et explications sur la conception du plugin.</p>
<p><span id="more-1123"></span></p>
<h3>Widgets Amazon</h3>
<p>Amazon fournit des widgets au travers de son <a href="http://partenaires.amazon.fr">programme Partenaires</a> (également nommé <em>Associates</em> dans le reste du monde). Ces widgets permettent d&#8217;intégrer des fonctionnalités sympathiques sur son propre site ou blog à partir d&#8217;un code <acronym title="HyperText Markup Language">HTML</acronym> généré par leur interface.</p>
<p>La liste des widgets et des fonctionnalités est assez importante :</p>
<ul>
<li>lien produit (avec ou sans image)</li>
<li>widget carrousel (présentation de produits dans un carrousel d&#8217;images)</li>
<li>widget slideshow (présentation de produits sur une bande déroulante)</li>
<li>widget envies cadeaux</li>
<li>liens textuels</li>
<li>liens aperçu produit</li>
<li>liens contextuels</li>
<li>etc.</li>
</ul>
<p>Les widgets se créent en ligne et au final, leur code <acronym title="HyperText Markup Language">HTML</acronym> nous est gentiement proposé.</p>
<p><strong>Premier constat</strong> : le code fourni par Amazon a beau être fonctionnel, c&#8217;est quand même un sacré bazar. Pour peu que l&#8217;on bascule de l&#8217;éditeur Visuel à l&#8217;éditeur <acronym title="HyperText Markup Language">HTML</acronym> de WordPress, le code est nettoyé par endroit le rendant quasi inutilisable.</p>
<p><strong>Second constat</strong>, copier ce code dans l&#8217;éditeur visuel de WordPress (TinyMCE) est passablement horrible avec parfois jusqu&#8217;à 10 lignes de <acronym title="HyperText Markup Language">HTML</acronym> illisible.</p>
<p>Enfin, côté maintenance c&#8217;est pas gagné : si Amazon change le code <acronym title="HyperText Markup Language">HTML</acronym> des éléments sans assurer de rétrocompatibilité (ce que je ne leur souhaite pas), les widgets déjà insérés seraient rendus inopérants.</p>
<div id="attachment_1144" class="wp-caption aligncenter" style="width: 355px"><img class="size-full wp-image-1144" title="Arborescence du code d'Amazon Widgets Shortcodes" src="http://case.oncle-tom.net/images/2008/09/awshortcode-workspace.png" alt="Arborescence du code d'Amazon Widgets Shortcodes" width="345" height="419" /><p class="wp-caption-text">Arborescence du code d&#39;Amazon Widgets Shortcodes</p></div>
<h3>Les objectifs fixés et avoués du plugin Amazon Widgets Shortcodes</h3>
<p>Toujours désireux d&#8217;utiliser les widgets Amazon et sentant que ça pouvait être pratique, je me suis dit que c&#8217;était l&#8217;occasion rêvée de produire un plugin utile, bien conçu et fiable.</p>
<p>En développant ce plugin, je me devais d&#8217;atteindre ces objectifs :</p>
<ul>
<li>le rendre <strong>internationalisable</strong> (<acronym title="internationalisation">i18n</acronym>)</li>
<li>le proposer en 2 langues minimum (français et anglais)</li>
<li>permettre son <strong>exploitation facilement</strong> et sans se prendre la tête (<acronym title="Keep it simple, stupid">KISS</acronym>)</li>
<li>fournir une <strong>documentation</strong> d&#8217;utilisation appropriée</li>
<li>rendre l&#8217;<strong>évolution du code aussi souple que possible</strong></li>
</ul>
<h3>Stratégie de développement</h3>
<p>Maintenant que j&#8217;avais les idées, il fallait les mettre en place. Voici comment j&#8217;avais envisagé les étapes du développement :</p>
<ol>
<li>support d&#8217;1 seul widget Amazon</li>
<li>augmentation du nombre de widgets Amazon supportés</li>
<li>stabilisation de l&#8217;<acronym title="Application Programming Interface">API</acronym> et internationalisation</li>
<li>configuration intégrale depuis l&#8217;admin WordPress</li>
<li>intégration des widgets depuis l&#8217;éditeur <acronym title="HyperText Markup Language">HTML</acronym> WordPress (TinyMCE)</li>
<li>intégration du copier/coller de code <acronym title="HyperText Markup Language">HTML</acronym> Amazon</li>
<li>support intégral des widgets</li>
<li>améliorations pratiques et ergonomiques</li>
<li>utilisation en tant que widgets dans les thèmes WordPress</li>
<li>gestion intégrée des widgets (Amazon ne fournissant aucune <acronym title="Application Programming Interface">API</acronym> à ce niveau)</li>
</ol>
<p>Cette progression permet de créer petit à petit l&#8217;application, de la rendre modulaire et extensible. L&#8217;ajout et le support de nouveaux widgets ne doit pas remettre en cause l&#8217;architecture du plugin.</p>
<div id="attachment_1143" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-1143" title="Code JavaScript d'Amazon Widgets Shortcodes" src="http://case.oncle-tom.net/images/2008/09/awshortcode-javascript-abstraction.png" alt="Code JavaScript d'Amazon Widgets Shortcodes" width="500" height="405" /><p class="wp-caption-text">Code JavaScript d&#39;Amazon Widgets Shortcodes</p></div>
<h3>Ce à quoi il faut penser en développant un plugin</h3>
<p>Développer un plugin c&#8217;est bien. Il faut cependant toujours avoir en tête qu&#8217;il ne sera pas installé que sur son propre blog. Ça doit être le <em>leitmotiv</em> qui accompagne toute nouvelle idée afin de prévoir les installations et mises à jour.</p>
<p>Voici <strong>5 points clés pour développer un bon plugin</strong> :</p>
<ol>
<li>penser <strong>utilisateur</strong> avant tout (c&#8217;est lui qui doit savoir l&#8217;utiliser, pas ses développeurs)</li>
<li>penser que le développement pourra se faire en <strong>équipe</strong> (clarté du code, documentation)</li>
<li>penser que le plugin pourra être utilisé dans <strong>plusieurs langues</strong> (<acronym title="internationalisation">i18n</acronym>)</li>
<li>penser aux <strong>scénarios de mise à jour</strong> (base de données, tests fonctionnels/unitaires)</li>
<li>penser que ce plugin n&#8217;est pas le seul sur le blog (optimisation, nommage)</li>
</ol>
<h3>Intégration d&#8217;un widget Amazon par copier/coller</h3>
<p>C&#8217;est le serpent qui se mord la queue diraient certains.<br />
Et pourtant, c&#8217;est la meilleure fonctionnalité qu&#8217;on puisse apporter. Tout le monde n&#8217;étant pas technicien, les utilisateurs lambda apprécieront de pouvoir simplement se débarrasser de leur code <acronym title="HyperText Markup Language">HTML</acronym> Amazon pour le convertir sur leur blog.</p>
<p>Simple comme bonjour !</p>
<div style="text-align:center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/BigIblty910" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/BigIblty910"></embed></object></div>
<h3>Conclusion</h3>
<p><strong>Le développement d&#8217;un plugin WordPress est relativement aisé</strong>. Certaines parties de la documentation sont quelque peu obscures, notamment celle qui touche l&#8217;éditeur <acronym title="HyperText Markup Language">HTML</acronym> et son internationalisation. Il m&#8217;a fallu m&#8217;inspirer d&#8217;autres plugins mais aussi comprendre que WordPress 2.5 mettait en cache la configuration de TinyMCE dans un fichier.</p>
<p>L&#8217;autre partie ardue fût le plugin TinyMCE : la documentation est toujours partagée entre la version 2 et la version 3 et là encore, la meilleure documentation reste le code source d&#8217;origine. Je saluerai au passage le gros effort de lisibilité que leur équipe a apporté. On en prendrait presque du plaisir à le lire <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Quoiqu&#8217;il en soit, le plugin WordPress <a href="http://wordpress.org/extend/plugins/amazon-widgets-shortcodes/">Amazon Widgets Shortcodes</a> est bel et bien <strong>prêt à être utilisé</strong> par le grand public. Le minimum vital est là. Le confort aussi.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/plugin-wordpress-amazon-widgets-shortcodes/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Gérer sa blogroll sur une page à part avec WordPress et les modèles de page</title>
		<link>http://case.oncle-tom.net/2008/gerer-sa-blogroll-sur-une-page-a-part-avec-wordpress-et-les-modeles-de-page/</link>
		<comments>http://case.oncle-tom.net/2008/gerer-sa-blogroll-sur-une-page-a-part-avec-wordpress-et-les-modeles-de-page/#comments</comments>
		<pubDate>Tue, 13 May 2008 05:00:03 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[blogroll]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[template]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=909</guid>
		<description><![CDATA[J&#8217;ai récemment lu une astuce pour afficher sa blogroll sur une page à part et ça m&#8217;a donné envie de réagir à la solution proposée. Gérer sa blogroll sur une page dédiée est une bonne idée car ça évite de surcharger inutilement ses barres latérales de liens, surtout s&#8217;ils sont nombreux. Cette séparation permet également [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="Logo WordPress" width="273" height="66" /></p>
<p>J&#8217;ai récemment lu une astuce pour afficher sa blogroll sur une page à part et ça m&#8217;a donné envie de réagir à la solution proposée.</p>
<p><strong>Gérer sa blogroll sur une page dédiée est une bonne idée</strong> car ça évite de surcharger inutilement ses barres latérales de liens, surtout s&#8217;ils sont nombreux. Cette séparation permet également d&#8217;avoir davantage de liberté pour les présenter et les styler. Ce n&#8217;est pas un mal pour apporter un souffle d&#8217;originalité.</p>
<p><span id="more-909"></span></p>
<p>En revanche la solution du copié/collé n&#8217;est pas à mes yeux une <em>véritable solution</em> car :</p>
<ul>
<li>soit on gère sa blogroll dans le module de blogroll et on doit systématiquement copier/coller le résultat dans une page</li>
<li>soit on gère directement la blogroll dans la page dédiée ; le module de gestion perdant alors totalement son intérêt</li>
</ul>
<p>Je suis feignant donc je n&#8217;aime pas faire le travail 2 fois alors je propose une solution qui fonctionnera chez vous. C&#8217;est d&#8217;ailleurs celle que j&#8217;emploie depuis la refonte de ce blog &#8230; c&#8217;est à dire bientôt 1 an.</p>
<h3>Les modèles de page WordPress</h3>
<p>Il existe peu de différences entre une page et un article dans WordPress :</p>
<ul>
<li>les <strong>articles sont datés</strong>, n&#8217;ont pas de hiérarchie et peuvent être dans 1 ou plusieurs catégories</li>
<li>les p<strong>ages ne le sont pas datées</strong>, ont une hiérarchie et ne peuvent pas être dans une catégorie</li>
</ul>
<p>Les pages possèdent également un autre atout : <strong>on peut leur appliquer un modèle de présentation</strong>. Cette pratique est adaptée à toute présentation où vous souhaiteriez afficher davantage que le seul texte saisi depuis l&#8217;interface d&#8217;administration.</p>
<p>La notion des <a href="http://codex.wordpress.org/Pages#Page_Templates">templates de pages</a> est bien expliquée dans le <a href="http://codex.wordpress.org">Codex WordPress</a>. Petit rappel synthétique néanmoins.</p>
<p>Un template de page correspond à un fichier créé dans le répertoire du thème de votre choix (celui que vous utilisez de préférence). Autrement dit ça correspond à un fichier comme ceci : <code>wp-content/themes/&lt;votre thème&gt;/&lt;votre template&gt;.php</code>.</p>
<p>Ce fichier de template doit obligatoirement comporter une entête de description. Sans elle, pas de sélection possible depuis la page de rédaction. Cette entête doit correspondre à ceci :</p>
<pre><code class="php">&lt;?php
/*
Template Name: &lt;Nom du template&gt;
*/</code></pre>
<p>La dernière étape avant son utilisation consiste à tapoter un peu de code <acronym title="Pre-Hypertext Processing">PHP</acronym> pour aboutir à votre souhait. N&#8217;hésitez pas à parcourir la <a href="http://codex.wordpress.org">documentation de WordPress</a> pour produire un code pérenne et utiliser au maximum les <a href="http://codex.wordpress.org/Function_Reference">fonctionnalités proposées par WordPress</a>.</p>
<h3>Un modèle de page WordPress pour Blogroll</h3>
<p>Notre besoin initial tombe à point nommé puisque nous avons justement besoin d&#8217;un template de page pour gérer sa blogroll depuis son module d&#8217;administration sans avoir à mettre à jour manuellement quelconque autre page que ce soit <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>La première étape consiste à créer un nouveau template dans le thème employé par votre blog. Si vous utilisez le thème de base, le thème default, nous allons créer le fichier suivant :<br />
wp-content/themes/default/template-blogroll.php.</p>
<p>Pour remplir ce fichier, nous allons devoir accéder aux éléments contenus dans la blogroll. Ça tombe bien puisqu&#8217;il existe pour ça la fonction <a href="http://codex.wordpress.org/wp_list_bookmarks">wp_list_bookmarks()</a>.<br />
À ce stade, notre template devrait ressembler à ça :</p>
<pre><code class="php">&lt;?php
/*
Template Name: Liens
*/
get_header() ?&gt;
&lt;h2&gt;&lt;?php the_title() ?&gt;&lt;/h2&gt;
&lt;?php the_content() ?&gt;
&lt;ol id="page-blogroll"&gt;
  &lt;?php <strong>wp_list_bookmarks()</strong> ?&gt;
&lt;/ol&gt;
&lt;?php get_sidebar() ?&gt;
&lt;?php get_footer() ?&gt;</code></pre>
<p>Une fois enregistré, le modèle apparaît dans le sélecteur de modèle (uniquement sur les contenus de type <em>Page</em>) :</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-910" title="Wordpress Template Selector" src="http://case.oncle-tom.net/images/2008/05/wordpress-template-selector.png" alt="Wordpress Template Selector" width="500" height="90" /></p>
<p>Ça y&#8217;est, vous avez votre page dédiée aux liens sans travail de recopie supplémentaire.</p>
<h3>Un modèle imparfait</h3>
<p>Attention toutefois puisque créer un modèle signifie que <strong>WordPress ne va utiliser QUE ce modèle</strong> pour la présentation. Autrement dit il va falloir toute reproduire jusqu&#8217;au titre de la page si vous le désirez.</p>
<p>L&#8217;exemple ci-dessus est minimaliste à ce sujet pour la simple et bonne raison que <strong>le balisage dépendra uniquement du thème employé</strong>. Ça explique pourquoi les modèles sont à définir au cas par cas.</p>
<p>Pour bien reproduire le thème, plusieurs possibilités :</p>
<ul>
<li><em>vous vous débrouillez</em> vous-même pour comprendre comment est construit l&#8217;affichage du thème</li>
<li>vous <em>connaissez quelqu&#8217;un</em> qui se débrouille avec WordPress et vous lui demandez de le faire (pas la peine de me demander)</li>
</ul>
<h3>Conclusion</h3>
<p>Les modèles de page (ou templates) est une fonctionnalité assez méconnue mais pourtant ô combien utile pour les utilisations suivantes :</p>
<ul>
<li>utilisation tournée <acronym title="Content Management System">CMS</acronym></li>
<li>affichage différent pour certaines pages uniquement, sans vouloir créer un thème spécifique</li>
<li>création de pages plus riches allant au-delà de la simple présentation de contenu rédigé</li>
</ul>
<p>Si vous vous débrouillez bien, vous aurez un résultat comme sur ma page de liens, <a href="http://case.oncle-tom.net/liens/">les liens de l&#8217;Oncle Tom</a>.<br />
Et n&#8217;oubliez pas, dès que vous pensez &laquo;&nbsp;spécifique&nbsp;&raquo;, pensez <strong>modèle de page</strong> <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/gerer-sa-blogroll-sur-une-page-a-part-avec-wordpress-et-les-modeles-de-page/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>BlogCamp : pour devenir blogueur et améliorer son blog</title>
		<link>http://case.oncle-tom.net/2008/blogcamp-pour-devenir-blogueur-et-ameliorer-son-blog/</link>
		<comments>http://case.oncle-tom.net/2008/blogcamp-pour-devenir-blogueur-et-ameliorer-son-blog/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 06:00:53 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blog@bordeaux]]></category>
		<category><![CDATA[blogcamp bordeaux]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[bordeaux]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2008/02/05/blogcamp-pour-devenir-blogueur-et-ameliorer-son-blog/</guid>
		<description><![CDATA[Si seulement TiBo avait imaginé que son blog@bordeaux avait semé les germes de BlogCamp France &#8230; et pourtant c&#8217;est le cas. Je vais évangéliser en faveur de cette association toute fraîche de promotion des blogs auprès des blogueurs &#8230; mais aussi ceux qui ne le sont pas (encore). Je vais également tâcher d&#8217;expliquer les motivations [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img src='http://case.oncle-tom.net/images/2008/02/blogcamp-france-logo.png' alt='Logo BlogCamp France' /></p>
<p>Si seulement <a href="http://www.tibo-etc.com/">TiBo</a> avait imaginé que son <a href="http://www.thibaut-charron.com/blog/2007/10/27/blogbordeaux/">blog@bordeaux</a> avait semé les germes de <a href="http://www.blogcamp.fr/">BlogCamp France</a> &#8230; et pourtant c&#8217;est le cas.</p>
<p>Je vais évangéliser en faveur de cette association toute fraîche de <strong>promotion des blogs auprès des blogueurs</strong> &#8230; mais aussi ceux qui ne le sont pas (encore). Je vais également tâcher d&#8217;expliquer les <em>motivations</em> de mon implication et pourquoi ça vaut bien quelques cernes marquées. Il y a des tabous à lever &#8230; et des <em>bonnes pratiques</em> à apporter <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<span id="more-863"></span></p>
<h3>BlogCamp, qu&#8217;est-ce que c&#8217;est ?</h3>
<blockquote><p>BlogCamp est un rendez-vous mensuel entre blogueurs dans l&#8217;esprit des <a href="http://barcamp.org/">BarCamp</a> bien connus des technophiles. La seule différence est que dans un BlogCamp on parle blog life et pas forcément que de nouvelles technologies et d&#8217;Internet. Tous les blogueurs ne sont en effet pas des professionnels du Web (si, si).</p>
</blockquote>
<p>Le décor est planté, reste à le comprendre.</p>
<p>Quand on constate que les 2/3 des blogs se paraphrasent entre eux, que les blogs sont associées à des récits puérils (y compris jusqu&#8217;au niveau des entreprises) et qu&#8217;à Bordeaux il manquait un tissu social numérique, l&#8217;idée de BlogCamp est née. L&#8217;idée d&#8217;une <strong>réunion conviviale où les outils et les connaissances seraient mis à disposition du public</strong>, blogueurs ou pas. L&#8217;essentiel étant d&#8217;être curieux et intéressé par ce phénomène auréolé de stéréotypes.</p>
<h3>BlogCamp, le rendez-vous des blogueurs &#8230; et de ceux qui ne le sont pas</h3>
<p>Les stéréotypes parlons-en. Ils gravitent autour de 2 expressions phares :</p>
<ul>
<li><q>Je suis blogueur</q></li>
<li><q>Blogosphère</q></li>
</ul>
<p><strong>Le blogueur est une personne comme vous et moi</strong> : normale. Le blogueur n&#8217;est pas un être surnaturel ou un superhéros venu de Krypton pour sauver l&#8217;internaute lambda d&#8217;un ennui mortel. Être blogueur c&#8217;est avant tout une idée de partage, aussi maladroite soit son expression.</p>
<p>Ça rejoint d&#8217;ailleurs très bien l&#8217;idée que l&#8217;on forge de la <q>blogosphère</q> : fermée de l&#8217;extérieur, en circuit fermé de l&#8217;intérieur. En clair ça sent le moisi. Comment inciter les gens bien intentionnés et peu connaisseurs de se lancer dans un blog en pensant qu&#8217;il faut être fort et avoir de bonnes relations ?</p>
<p>C&#8217;est pour ça que <strong>BlogCamp s&#8217;adresse à celles et ceux qui ont un blog ou qui n&#8217;en ont pas</strong> mais qui souhaiteraient en avoir un.</p>
<p style="text-align:center"><a href="http://www.flickr.com/photos/22239045@N03/2222147955/"><img src="http://farm3.static.flickr.com/2353/2222147955_7a84df9e7a.jpg" alt="Présentation BlogCamp ergonomie et usabilité" /></a></p>
<h3>Le contenu et les conversations au cœur des rendez-vous</h3>
<p>BlogCamp cherche à créer du contenu en <strong>diffusant des bonnes pratiques</strong>, en dispensant des <strong>ateliers techniques</strong> et en <strong>réservant du temps aux échanges entre participants</strong>. Un soin tout particulier est apporté pour intégrer les nouvelles têtes afin de les mettre à l&#8217;aise.<br />
Chaque mois ce sont des conférences, avec des intervenants extérieurs ou pas, pour éduquer les esprits :</p>
<ul>
<li>les blogs ne sont pas des sapins de Noël : la dizaine de widgets des barres latérales n&#8217;ont pas à exister</li>
<li>l&#8217;identité d&#8217;un blog ça se construit : nous donnons les pistes à explorer</li>
<li>le référencement d&#8217;un blog peut être facilité avec un minimum de bonnes pratiques</li>
</ul>
<p>Bien d&#8217;autres concepts sont à aborder et leur orientation dépendra des sensations perçues lors des différentes interventions. L&#8217;idée est que tout participant y trouve son compte, apprenne des choses et mûrisse dans son approche du blog. Le <q>kikoolol</q> de SkyBlog a suffisamment hanté les consciences.</p>
<h3>BlogCamp, le concept déclinable clés en main</h3>
<p>La face cachée de BlogCamp c&#8217;est la <strong>réflexion dans sa conception</strong> : tout a été pensé pour que le concept soit facilement déclinable et facilement reproductible dans une autre ville de France.<br />
BlogCamp c&#8217;est aussi une solution packagée clés en main avec nom de domaine, hébergement, emails, ressources (wiki, diaporamas, cartes de visite etc.) et toute la synergie médiatique. Quelques détails sont encore à régler mais en l&#8217;espace de quelques minutes, un nouveau BlogCamp peut se créer en France en un minimum d&#8217;efforts.</p>
<p>Pour cela, <strong>BlogCamp repose essentiellement sur du logiciel libre et des standards ouverts</strong>. Internet est né grâce à cette ouverture, les blogs doivent poursuivre sur cette voie.</p>
<p><a href="http://blogcamp.fr/2008/02/01/blogcamp-bordeaux-3/">La troisième session de BlogCamp Bordeaux se tiendra le vendredi 29 février 2008 à 19h00</a>. J&#8217;espère y rencontrer un maximum de personnes désireuses d&#8217;en savoir plus sur les blogs et leur utilisation.<br />
Profitez-en, c&#8217;est gratuit et c&#8217;est pas votre pouvoir d&#8217;achat qui rechignera <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/blogcamp-pour-devenir-blogueur-et-ameliorer-son-blog/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ajouter les tags WordPress dans une balise META</title>
		<link>http://case.oncle-tom.net/2007/tags-wordpress-balise-meta-keywords/</link>
		<comments>http://case.oncle-tom.net/2007/tags-wordpress-balise-meta-keywords/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 11:00:38 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[tags]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/10/02/tags-wordpress-balise-meta-keywords/</guid>
		<description><![CDATA[Alexandre Balmes est à la fois content et déçu des tags de WordPress et pour cause, les nouvelles fonctions ajoutées ne permettent leur utilisation que dans the Loop (la Boucle, la boucle d&#8217;affichage du contenu de WordPress). Certes il y a des plugins qui produisent ce même effet (All in One SEO par exemple) mais [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="Logo WordPress" width="273" height="66" /></p>
<p><a href="http://www.alexandrebalmes.fr/wordpress/wordpress-23-les-tags/">Alexandre Balmes est à la fois content et déçu des <em>tags</em> de WordPress</a> et pour cause, les nouvelles fonctions ajoutées ne permettent leur utilisation que dans <a href="http://codex.wordpress.org/the_Loop"><em>the Loop</em></a> (<em>la Boucle</em>, la boucle d&#8217;affichage du contenu de WordPress).</p>
<p>Certes il y a des plugins qui produisent ce même effet (<a href="wordpress.org/extend/plugins/all-in-one-seo-pack/">All in One SEO</a> par exemple) mais c&#8217;est un peu comme acheter une crémerie juste pour manger un bon coulant : <em>démesuré</em>.<br />
<span id="more-780"></span></p>
<h3>L&#8217;idée</h3>
<p>L&#8217;idée de départ est de collecter la liste des tags employés sur la page et de l&#8217;injecter dans une balise META nommé <em>keywords</em>. WordPress est suffisamment bien fichu pour qu&#8217;on n&#8217;ait pas à tripatouiller son code.</p>
<p>On va donc décortiquer une <strong>fonction qui sera appelée systématiquement sur toutes les pages contenant potentiellement des tags</strong>, on aggrègera tout ça pour l&#8217;afficher dans l&#8217;entête de la page.</p>
<h3>Le code</h3>
<p>En attendant que j&#8217;en fasse un plugin à part entière un peu plus modulable, voici la démarche technique employée.</p>
<ul>
<li><a title="Tags : META keywords" href="http://case.oncle-tom.net/images/2007/10/tags-meta-keywords.txt">Tags : META keywords</a> : code est à copier/coller à la fin du fichier <code>functions.php</code> du thème employé sur votre installation de WordPress</li>
</ul>
<pre><code class="php">/*
 * Petite vérification qui évite :
 * - de générer une erreur le jour où une telle fonction est introduite
 * - d'utiliser des ressources inutiles (dans l'admin, pas besoin de générer de balise keyword)
 */
if (!function_exists('get_all_tags_meta') &amp;&amp; !is_admin()) :
/**
 * get_all_tags_meta()
 *
 * Génère une entête META 'keywords' contenant les tags utilisés sur la page
 */
function get_all_tags_meta()
{
  global $posts;
  //$tags contiendra tous les tags trouvés par la suite
  //Il est tout à fait envisageable de la pré-remplir à la main ou via les options de WordPress (get_option())
  $tags = array();
  //On sort de la fonction si :
  //- les posts n'existent pas (cas d'appel de fonction AVANT que the Loop soit effectuée
  //- il n'y a aucun post (erreur 404, recherche infructueuse, catégorie/tag vide etc.)
  if (!isset($posts) || empty($posts))
  {
    return false;
  }
  //On boucle sur chaque post disponible pour en extraire les tags
  for ($posts_length = count($posts), $i = 0; $i &lt; $posts_length; $i++)
  {
    //Comme il peut y avoir un ou plusieurs tag par post, là encore on boucle
    //Les tags ne sont pas directement stockés dans $posts, il faut passer par l'<acronym title="Application Programming Interface">API</acronym> de taxinomie (wp_includes/taxonomy.php)
    foreach (get_object_term_cache( $posts[$i]-&gt;ID, 'post_tag' ) as $tag)
    {
      $tags[] = $tag-&gt;name;
    }
  }
  //Dédoublonnage du tableau final
  $tags = array_unique($tags);
  //On n'affiche l'entête que si elle n'est pas vide, voilà tout
  if (!empty($tags))
  {
    printf('&lt;meta name="%s" content="%s" /&gt;', 'keywords', implode(', ', $tags));
  }
}
//On exécute la fonction sur le hook wp_head()
//On pourrait le faire sur wp_foot mais cette fonction n'est pas systématiquement incluses (à tort) sur tous les thèmes
add_action('wp_head', 'get_all_tags_meta');
endif;</code></pre>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/tags-wordpress-balise-meta-keywords/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Migration vers WordPress 2.3 réussie</title>
		<link>http://case.oncle-tom.net/2007/migration-wordpress-23-reussie/</link>
		<comments>http://case.oncle-tom.net/2007/migration-wordpress-23-reussie/#comments</comments>
		<pubDate>Fri, 28 Sep 2007 11:00:28 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[seo title tag]]></category>
		<category><![CDATA[simpletagging]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/09/28/migration-wordpress-23-reussie/</guid>
		<description><![CDATA[WordPress 2.3 est sorti, accompagné de sa traduction française. C&#8217;est un fait et je conseille aux aventuriers de toujours mais alors toujours faire une sauvegarde de leurs fichiers et de leur base de données avant de se lancer dedans. Compte-rendu d&#8217;une migration qui s&#8217;est passée sans trop de problèmes et point rapide sur quelques correctifs [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><a href="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png"><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="Logo WordPress" width="273" height="66" /></a></p>
<p><a href="http://www.wordpress-fr.net/blog/wordpress/sortie-de-wordpress-23-et-de-son-pack-franais">WordPress 2.3 est sorti, accompagné de sa traduction française</a>. C&#8217;est un fait et je conseille aux aventuriers de toujours mais alors toujours faire une sauvegarde de leurs fichiers et de leur base de données avant de se lancer dedans. <strong>Compte-rendu d&#8217;une migration</strong> qui s&#8217;est passée sans trop de problèmes et <strong>point rapide sur quelques correctifs</strong> appliqués pour rendre le tout fonctionnel.<br />
<span id="more-776"></span></p>
<h3>Préparatifs de mise à jour</h3>
<p>La meilleure solution pour migrer en cas de doute c&#8217;est d&#8217;avoir de vrais amis et qui ont déjà réalisé ce genre d&#8217;intervention. Ca évite de faire des choses sans les comprendre et de flinguer son blog en se rendant compte après coup que &#8230; ben pas de sauvegarde. <strong>La sauvegarde c&#8217;est obligatoire</strong> (il peut <em>toujours</em> y avoir un pépin) et concerne aussi bien la <strong>base de données</strong> que les <strong>fichiers</strong>.<br />
Pourquoi ? Parce que si la mise à jour ne se fait pas, on peut revenir en arrière et reprendre sa vie comme si de rien n&#8217;était.</p>
<p>Le plus souple pour sauvegarder/restaurer est de passer par des instructions en ligne de commande. <strong>phpMyAdmin</strong> c&#8217;est bien mais bien souvent limité à des restaurations de 2Mo (sauf les dernières versions qui se débrouillent pour reprendre au dernier point d&#8217;arrêt) :</p>
<pre><code class="sql">mysqldump -h <em>votre hôte MySQL</em> -u <em>utilisateur</em> -p <em>votre base de données</em> &gt; <em>sauvegarde.sql</em></code></pre>
<p>La restauration se fait en un clin d&#8217;œil par cette autre commande :</p>
<pre><code class="sql"><ins>mysql</ins> -h <em>votre hôte MySQL</em> -u <em>utilisateur</em> -p <em>votre base de données</em> <ins>&lt;</ins> <em>sauvegarde.sql</em></code></pre>
<p>La sauvegarde de vos fichiers peut également se faire rapidement en vous plaçant à la racine du répertoire WordPress (vous devez voir le répertoire <code>wp-admin</code> sous vos yeux) :</p>
<pre><code class="bash">tar -czf <em>sauvegarde.tar.gz</em> *</code></pre>
<p><strong>Remarque</strong> : mieux vaut ne supprimer ces sauvegardes que lorsqu&#8217;on est sûr que tout fonctionne après la mise à jour. De même, il faut faire attention à ce que ces <strong>sauvegardes ne soient pas accessibles au public</strong> sinon un simple téléchargement dévoile le mot de passe de la base de données. Prudence donc.</p>
<h3>Changements pour jQuery</h3>
<p>Depuis la version 2.2, WordPress effectue une transition de la librairie JavaScript Prototype vers jQuery. Si cette dernière est toujours disponible, il y a eu du changement puisque la directive <code>jQuery.noConflict()</code> est activée.<br />
<a href="http://docs.jquery.com/Core/jQuery.noConflict">La documentation à propos de noConflict()</a> est explicite sur sa signification. Au lieu d&#8217;utiliser jQuery avec la fonction dollar (<code>$()</code>), il faut passer par la fonction <code>jQuery()</code>.</p>
<p><strong>La solution à apporter à vos scripts qui se basaient dessus est simple</strong> : rechercher/remplacer (<kbd>CTRL+H</kbd> en général sur les éditeurs de texte) <code>$(</code> par <code>jQuery(</code>.</p>
<h3>Problème avec Simple Tagging</h3>
<p><strong>Simple Tagging</strong> était une solution intuitive et sympa de gestion de tags avant que ce concept ne soit intégré nativement dans la version 2.3 de WordPress. J&#8217;appréciais sa saisie prédictive et j&#8217;envisageais de l&#8217;utiliser pour suggérer des articles connexes. Malheureusement ce plugin n&#8217;est plus compatible (y compris dans sa version 1.7) et <a href="http://www.wordpress-fr.net/blog/themes/les-tags-dans-wordpress-23-explications-et-importation-depuis-les-anciens-plugins">il faudra attendre sa refonte prévue et en cours de réalisation</a>.</p>
<h3>Problème avec SEO Title Tag 2.0RC2</h3>
<p><strong>SEO Title Tag</strong> permet de choisir des titres complémentaires à vos pages. Le soucis c&#8217;est qu&#8217;il entre en conflit avec <em>WordPress 2.3</em> en cas d&#8217;utilisation native des <em>tags</em> (et uniquement dans ce cas là). Lors de l&#8217;affichage des articles par tag, une erreur souille votre écran.<br />
Concrètement <em>SEO Title Tag</em> s&#8217;embrouille en pensant que le plugin <em>Ultimate Tag Warrior</em> est installé et tente de faire appel à une de ses fonctions. D&#8217;où l&#8217;erreur. <a href="http://www.netconcepts.com/seo-title-tag-plugin/#comment-116165">J&#8217;ai proposé ma solution sur le site officiel</a> mais je la partage à nouveau ici.</p>
<p>Il faut modifier le fichier <code>seo-title-tag.php</code>, se rendre à la ligne 285 et faire en sorte que</p>
<pre><code>} elseif(function_exists('is_tag') &amp;&amp; is_tag()) {</code></pre>
<p>devienne</p>
<pre><code>} elseif(function_exists('is_tag') &amp;&amp; is_tag() <ins>&amp;&amp; isset($utw)</ins>) {</code></pre>
<p>Testé et approuvé.</p>
<h3>Point rapide sur les tags</h3>
<p><strong>WordPress 2.3</strong> apporte sa propre gestion des <em>tags</em>. La question récurrente est <q>qu&#8217;utiliser, tags ou catégories ?</q>. Les deux mon capitaine. Utilisez toujours les <strong>catégories pour classer vos rédactions</strong>. Les <strong>tags sont là pour affiner</strong> ce classement en ajoutant des correspondance. Dans un registre plus fromager, les catégories correspondraient au type de lait de fromage (vache, brebis, chèvre etc.) et les tags seraient des compléments (bleu, pâte molle, pâte pressée etc.).</p>
<p><strong>Du coup je déconseille d&#8217;utiliser le convertisseur de catégories en tags</strong>. Ca ruinerait toute classification et vos lecteurs s&#8217;y perdraient.</p>
<p>La logique de WordPress était d&#8217;<strong>introduire son propre moteur de gestion de tags et que les plugins complètent</strong> leur gestion en vous facilitant la vie pour que chacun les gère comme il le sente. <strong>Et c&#8217;est plutôt malin et bien pensé</strong>.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/migration-wordpress-23-reussie/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Les meilleurs plugins pour WordPress</title>
		<link>http://case.oncle-tom.net/2007/meilleurs-plugins-wordpress/</link>
		<comments>http://case.oncle-tom.net/2007/meilleurs-plugins-wordpress/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 11:00:27 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[flickrrss]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[spam]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/08/27/meilleurs-plugins-wordpress/</guid>
		<description><![CDATA[WordPress c&#8217;est bien. Bien utiliser WordPress c&#8217;est mieux ! Si je trouve l&#8217;installation de base de cette plateforme de rédaction plus qu&#8217;aboutie, certains plugins sont indispensables pour améliorer votre blog, son suivi et sa présence sur Internet. Je me permets donc de partager ma sélection des plugins que je trouve utiles pour une utilisation quotidienne [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="Logo WordPress" width="273" height="66" /></p>
<p><a href="http://wordpress.org">WordPress</a> c&#8217;est bien. Bien utiliser <strong>WordPress</strong> c&#8217;est mieux !<br />
Si je trouve l&#8217;installation de base de cette plateforme de rédaction plus qu&#8217;aboutie, certains <em>plugins</em> sont indispensables pour améliorer votre blog, son suivi et sa présence sur Internet. Je me permets donc de partager ma sélection des plugins que je trouve utiles pour une utilisation quotidienne :</p>
<ul>
<li><strong>Akismet</strong></li>
<li>Dofollow</li>
<li>Feedburner FeedSmith</li>
<li>FlickrRSS</li>
<li>Full Text Feed</li>
<li>Google Analyticator</li>
<li>Google <acronym title="eXtensible Markup Language">XML</acronym> Sitemaps</li>
<li><strong>SEO Title Tag</strong></li>
<li><strong>Simple Tagging</strong></li>
<li><strong>Subscribe to Comments</strong></li>
<li><acronym title="WordPress">WP</acronym>-PostViews</li>
<li>WordPress.com Stats</li>
</ul>
<p>Ca en fait n&#8217;est-ce pas ? Tous ne vous seront pas indispensables (notamment si vous ne jouez pas avec <a href="http://www.flickr.com">Flickr</a> ni <a href="http://www.google.com/analytics/">Google Analytics</a>) mais peut-être que la lecture de ce billet vous en apprendra davantage et créer des envies <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<span id="more-740"></span></p>
<h3><a href="http://wordpress.org/extend/plugins/akismet/">Akismet</a></h3>
<p>Une de mes plus fortes motivations pour migrer de <strong>Dotclear</strong> à WordPress était la présence d&#8217;<em>Akismet</em>, antispam évolué et mutualisé. Pourquoi mutualisé ? Parce que le travail est déporté sur les serveurs d&#8217;Akismet sur lesquels sont &laquo;&nbsp;branchés&nbsp;&raquo; des milliers de blogs. Autant dire que si un spam est déclaré au service, tous les sites utilisant Akismet en sont protégés.<br />
C&#8217;est redoutable et ça m&#8217;a permis d&#8217;éviter de perdre du temps à modérer les messages en carton qui innondaient le blog. A l&#8217;heure actuelle, ce ne sont pas moins de 20 000 spams qui m&#8217;auront été épargnés. En l&#8217;espace de 12 mois, c&#8217;est appréciable.</p>
<h3><a href="http://www.semiologic.com/software/wp-fixes/dofollow/">Dofollow</a></h3>
<p>Les référenceurs et les personnes sensibilisées au référencement Web se doivent de savoir que <strong>WordPress ajoute la valeur<code>nofollow</code> à l&#8217;attribut <code>rel</code> des liens hypertextes de vos commentaires</strong>. Pour rappel, il s&#8217;agit d&#8217;un <em>microformat</em> spécifiant aux moteurs de recherche de ne pas tenir compte du-dit lien. Ceci a pour effet de ne pas prendre en compte l&#8217;éventuelle relation entre votre site et un site tiers pour des raisons évidentes de spam.</p>
<p>Les spams étant très bien écartés, <strong>autant laisser ce flux de liens sortants faire son effet</strong>.<br />
<em>Seul bémol</em> : ce plugin n&#8217;a pas d&#8217;interaction avec le widget officiel qui continuera à arborer un <code>rel="nofollow"</code>. Un petit <em>plus</em> sympathique qui incitera peut-être davantage au commentaire sur votre blog <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3><a href="http://www.feedburner.com/fb/a/help/wordpress_quickstart">Feedburner FeedSmith</a></h3>
<p><a href="http://www.feedburner.com">Feedburner</a> est un service permettant de <strong>mesurer l&#8217;utilisation de vos fils <acronym title="Really Simple Syndication"><acronym title="Really Simple Syndication">RSS</acronym></acronym> et Atom</strong>. <q>Combien de personnes suivent mon fil <acronym title="Really Simple Syndication">RSS</acronym> ?</q>, <q>Combien de nouveaux abonnés aujourd&#8217;hui ?</q> ou encore <q>Quels sont les articles les plus cliqués ou lus depuis les agrégateurs ?</q> seront le genre de questions pour lesquelles vous obtiendez <em>enfin</em> des réponses.</p>
<p><em>Sa configuration est aisée comme tout</em> et il serait dommage de se passer d&#8217;un outil statistique doublé d&#8217;outils de republication d&#8217;une telle envergure.<br />
Pour information, j&#8217;ai également publié un billet expliquant <a href="http://case.oncle-tom.net/2007/03/17/migrer-un-flux-rss-vers-feedburner/">comment migrer un flux <acronym title="Really Simple Syndication">RSS</acronym> vers Feedburner</a> pour celles et ceux ne pouvant installer ce plugin.</p>
<h3><a href="http://wordpress.org/extend/plugins/flickr-rss/">FlickrRSS</a></h3>
<p>Vous utilisez le <a href="http://www.flickr.com">service de gestion et de partage de photos Flickr</a> ? Une bonne idée est d&#8217;<strong>intégrer vos photos directement sur votre blog</strong> de manière &laquo;&nbsp;propre&nbsp;&raquo;, c&#8217;est à dire sans passer par un médaillon en Flash ou JavaScript ; ceci bien sûr dans l&#8217;intérêt de pénaliser le moins de monde possible.</p>
<p>Son gros atout est la personnalisation du plugin et son <em>widget</em> : <em>peu d&#8217;efforts pour un bon résultat</em>.</p>
<h3><a href="http://wordpress.org/extend/plugins/full-text-feed/">Full Text Feed</a></h3>
<p>Depuis une certaine version de WordPress (la 2.1 me semble-t-il), quand bien même on paramètre le blog pour afficher des flux intégraux (contenant l&#8217;intégralité des billets et non un court extrait), à partir du moment où un billet est précédé d&#8217;un chapô, seul celui-ci est publié dans le flux <acronym title="Really Simple Syndication">RSS</acronym>.<br />
Comme vous pouvez vous en douter, ce plugin remet les pendules à l&#8217;heure et c&#8217;est bien <em>dommage qu&#8217;une telle option ne soit pas proposée par défaut dans WordPress</em>.</p>
<h3><a href="http://wordpress.org/extend/plugins/google-analyticator/">Google Analyticator</a></h3>
<p><a href="http://www.google.com/analytics/">Google Analytics</a> est un formidable outil statistiques de sites Internet générant des rapports clairs au sein d&#8217;une interface qui l&#8217;est tout autant. Sans pub et sans logo affiché sur les sites audités, c&#8217;est pour moi le meilleur outil gratuit tant en terme de mesures que d&#8217;outils fournis.</p>
<p>Si jamais vous décidez de suivre votre audience par ce service (Feedburner propose un service similaire mais moins complet, on peut imaginer que tôt ou tard une fusion sera opérée à ce niveau), <strong>Google Analyticator</strong> permet de placer le traceur sans avoir à toucher le code des différents thèmes de votre blog. Il permet même de vous exclure des statistiques pour refléter au mieux le parcours de vos visiteurs.</p>
<h3><a href="http://wordpress.org/extend/plugins/google-sitemap-generator/">Google Sitemaps Generator</a></h3>
<p>Les <a href="http://www.sitemaps.org/">sitemaps</a> ont été initiées par Google afin de mieux signaler de nouveaux contenus ainsi que l&#8217;architecture de votre site. Depuis le format a été adopté par d&#8217;autres géants de la recherche sur Internet (Yahoo!, Ask etc.). En toute honnêteté, <strong>je pense qu&#8217;un site bien construit n&#8217;a pas besoin de <em>sitemap</em> pour être bien référencé</strong> mais comme l&#8217;installation du plugin est facile et ne demande aucune attention post-installation, pourquoi s&#8217;en priver ?</p>
<p>A réserver aux <em>aficionados</em> du référencement.</p>
<h3><a href="http://wordpress.org/extend/plugins/seo-title-tag/">SEO Title Tag</a></h3>
<p>Encore un plugin pour référenceurs ! Un blog gagne à être vu et <strong>SEO Title Tag</strong> est justement là pour ça. Il offre la possibilité de personnaliser son titre de page que ce soit pour une page statique, un billet, les pages d&#8217;archives, les catégories ou toute autre <acronym title="Uniform Resource Locator">URL</acronym> gérée par WordPress.</p>
<p>L&#8217;intérêt ? Eviter d&#8217;avoir des titres à rallonge affichés sur votre blog tout en bénéficiant de titres de pages plus longs et optimisés pour votre référencement. Un exemple concret est ce billet même. Regardez le titre au-dessus du texte (<q>Les meilleurs plugins pour WordPress</q>) et le titre affiché dans la barre de titre (<q>Les meilleurs plugins pour WordPress : Akismet, Feedburner, FlickRSS, SEO Title Tag, Simple Tagging</q>) &#8230; ça parle tout seul <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3><a href="http://wordpress.org/extend/plugins/simple-tagging-plugin/">Simple Tagging</a></h3>
<p>Encore un plugin pour référenceurs ? Hélas pour ceux qui s&#8217;en fichent, tant mieux pour ceux qui s&#8217;y intéressent. Les <em>tags</em> (ou labels ou encore mots-clés &#8211; mais ça rappelle l&#8217;époque de la bulle Internet) viennent en complément des catégories de WordPress.<br />
Le plugin est astucieux et pratique puisqu&#8217;il propose une saisie prédictive, suggère des <em>tags</em> et permet de voir des billets relatifs. Il faudra cependant mettre les mains dans le cambouis pour tirer pleinement parti de ses possibilités (lister des billets par tag notamment).</p>
<p><strong>Attention cependant</strong>, avec l&#8217;arrivée de WordPress 2.3, la gestion des tags sera directement intégrée et ne nécessitera pas de plugin (si ce n&#8217;est pour en étendre leurs fonctionnalités). Je vous conseille donc d&#8217;attendre la sortie de cette version. Je conseille ce plugin aux personnes qui ne migreront pas vers WordPress 2.3 mais aussi parce que je l&#8217;utilise depuis quelques semaines. Son utilisation m&#8217;a offert une visibilité dans certains moteurs comme <a href="http://technorati.com">Technorati</a>.</p>
<h3><a href="http://wordpress.org/extend/plugins/subscribe-to-comments/">Subscribe to Comments</a></h3>
<p>Cette fois ce plugin s&#8217;adresse à toutes et à tous mais surtout à vos visiteurs. Qui n&#8217;a jamais répondu à un commentaire et oublié de revenir sur un site pour voir si d&#8217;autres personnes avaient réagi ? Plein de monde dont moi. Difficile de s&#8217;abonner à tous les flux <acronym title="Really Simple Syndication">RSS</acronym> de commentaires de sites sur lesquels on est actif car c&#8217;en deviendrait impossible à gérer.</p>
<p>Heureusement <strong>Subscribe to Comments</strong> ajoute une petite boîte à cocher au niveau du formulaire des commentaires et ceci dans le but de notifier les auteurs de commentaires que de nouvelles réponses ont été publiées. <strong>Vraiment</strong>, vos visiteurs apprécieront et leur retour sur votre blog n&#8217;en sera que facilité.<br />
Du côté administration, il y a quelques statistiques sur les billets présentant le plus d&#8217;abonnés, les derniers abonnés etc.</p>
<h3><a href="http://wordpress.org/extend/plugins/wp-postviews/"><acronym title="WordPress">WP</acronym>-PostViews</a></h3>
<p>Une bonne petite extension narcissique mais qui permet de <strong>mesurer rapidement l&#8217;intérêt que portent les visiteurs à votre contenu</strong>. Comptabiliser le nombre de lectures de chaque article et afficher ce nombre est son dada. Il faudra cependant triturer un petit peu le code des thèmes dans lequel vous voulez intégrer le plugin après activation. Les instructions sont cependant suffisamment claires pour y parvenir avec un faible bagage technique.</p>
<h3><a href="http://wordpress.org/extend/plugins/stats/">WordPress.com Stats</a></h3>
<p>Enfin on termine sur des <strong>statistiques</strong>, <q>encore une fois</q> me direz-vous. Celles-ci sont fournies par l&#8217;éditeur de WordPress à partir du moment où vous disposez d&#8217;une clé <acronym title="Application Programming Interface"><acronym title="Application Programming Interface">API</acronym></acronym> WordPress (c&#8217;est le cas si Akismet est activé et configuré sur votre blog). Il fournit un onglet supplémentaire dans votre tableau de bord et <strong>résume les liens entrants vers votre blog, les billets les plus lus du jour, les liens externes cliqués et de la veille ainsi qu&#8217;une courbe de progression de votre audience</strong>.<br />
Je pense que c&#8217;est un <strong>bon plugin pour débuter</strong> et suffisamment complémentaire avec <em>Google Analytics</em> et <em>Feedburner</em> pour ne pas avoir à s&#8217;en passer.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/meilleurs-plugins-wordpress/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Akismet, tueur de spam</title>
		<link>http://case.oncle-tom.net/2007/akismet-antispam/</link>
		<comments>http://case.oncle-tom.net/2007/akismet-antispam/#comments</comments>
		<pubDate>Sat, 03 Feb 2007 12:00:06 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[spam]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/02/03/akismet-antispam/</guid>
		<description><![CDATA[Depuis que j&#8217;ai passé ce blog sous WordPress, je ne suis plus inquiété par le spam. Akismet veille sur lui et fait très bien son travail. Il apprend lui-même à repérer les spams, corrige ses erreurs et peut même être utilisé sur des sites Web ordinaires. Qui a dit que le spam c&#8217;était le Mal [...]]]></description>
			<content:encoded><![CDATA[<p>Depuis que j&#8217;ai passé ce blog sous <a href="http://wordpress.org">WordPress</a>, je ne suis plus inquiété par le spam. <a href="http://akismet.com/">Akismet</a> veille sur lui et fait très bien son travail. Il apprend lui-même à repérer les spams, corrige ses erreurs et peut même être utilisé sur des sites Web ordinaires.</p>
<p>Qui a dit que le spam c&#8217;était le Mal ?</p>
<p style="text-align:center;"><img id="image432" src="http://case.oncle-tom.net/images/2007/02/akismet-spam.png" alt="Akismet antispam" /></p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2007/akismet-antispam/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

