<?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; plugin</title>
	<atom:link href="http://case.oncle-tom.net/tag/plugin/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>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>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>Connexion à un serveur Citrix depuis Firefox sous Linux</title>
		<link>http://case.oncle-tom.net/2008/connexion-serveur-citrix-firefox-linux/</link>
		<comments>http://case.oncle-tom.net/2008/connexion-serveur-citrix-firefox-linux/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 05:00:54 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[citrix]]></category>
		<category><![CDATA[deb]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ica]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[metaframe]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[xenapp]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1172</guid>
		<description><![CDATA[Pour les besoins du boulot et non plus pour le plaisir, j&#8217;ai eu pour impératif de me connecter à un Intranet client via un VPN Citrix. Je ne sais pas pour vous, mais quand j&#8217;entends VPN, je commence à avoir des sueurs froides en me disant que la galère ne fait que commencer. Et bien [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1186" title="Chargement du serveur de présentation Citrix" src="http://case.oncle-tom.net/images/2008/10/citrix-loading.png" alt="" width="336" height="190" /></p>
<p>Pour les besoins du boulot et non plus pour le plaisir, j&#8217;ai eu pour impératif de me connecter à un Intranet client via un <a href="http://fr.wikipedia.org/wiki/Citrix_Presentation_Server">VPN Citrix</a>. Je ne sais pas pour vous, mais quand j&#8217;entends VPN, je commence à avoir des sueurs froides en me disant que la galère ne fait que commencer.</p>
<p>Et bien pour une fois, je peux dire que je n&#8217;ai presque pas ramé. Vous allez voir, c&#8217;est <strong>simple et rapide</strong>.<br />
<span id="more-1172"></span></p>
<h3>Citrix Presentation Server en 2 minutes</h3>
<p>Citrix Presentation Server c&#8217;est une manière d&#8217;offrir une connexion à des applications à distance indépendamment de la machine que l&#8217;on utilise. En clair, que l&#8217;on soit sous Linux, MacOS X ou Windows, on est censé pouvoir accéder à des applications d&#8217;une infrastructure distante.</p>
<p>Tout se fait via son navigateur Web préféré (Iceweasel sous Debian, Firefox sous Ubuntu dans mon cas). Seulement voilà, quand je souhaitais lancer l&#8217;application Putty pour profiter d&#8217;une jolie connexion <acronym title="Secure Shell">SSH</acronym>, <em>que nenni</em> !<br />
À la place, j&#8217;avais le droit de télécharger un fichier <em>launch.ica</em> qui, j&#8217;avoue, ne m&#8217;évoquais pas grand chose.</p>
<div id="attachment_1185" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-1185" title="Téléchargement d'un fichier .ica" src="http://case.oncle-tom.net/images/2008/10/citrix-ica.png" alt="Si on en est là, c'est qu'il y a un soucis" width="500" height="466" /><p class="wp-caption-text">Si on en est là, c&#39;est que ça ne va pas</p></div>
<h3>Installer le plugin ICA pour Linux</h3>
<p><a title="Citrix ICA Client How-To for Linux" href="http://www.agaveblue.org/howtos/Citrix_ICA_How-To.shtml ">Une recherche Google plus tard</a>, je découvre donc sans surprise qu&#8217;il me faut installer un client Citrix. J&#8217;ai un peu peur en imaginant qu&#8217;il ne fonctionne que sur des systèmes d&#8217;exploitation arriérés.</p>
<p>Et pourtant, quand on sait ce qu&#8217;il faut installer c&#8217;est tellement plus simple :</p>
<ol>
<li><a href="http://www.citrix.com/English/ss/downloads/details.asp?downloadId=3323&amp;productId=186&amp;c1=sot2755">Téléchargez le client ICA pour Linux</a>
<ol>
<li>En prenant la version <em>.tar.gz</em> puis en lançant <kbd>./setupwfc</kbd></li>
<li>En convertissant le .rpm par un petit <kbd>sudo alien -i ICAClient-10.6-1.i386.rpm</kbd></li>
<li>En <a title="ICAClient-10.6-1.i386.deb" href="http://dl.free.fr/nnJyoE8KW">utilisant le .deb</a> que j&#8217;ai créé avec <em>alien</em></li>
</ol>
</li>
<li>Liez le plugin ICA à votre navigateur Web
<ul>
<li>Sous Ubuntu : <kbd>ln –s /usr/lib/ICAClient/npica.so /usr/lib/mozilla/plugins/npica.so</kbd></li>
<li>Sous Debian : <kbd>ln –s /usr/lib/ICAClient/npica.so /usr/lib/iceweasel/plugins/npica.so</kbd></li>
</ul>
</li>
<li>Fermez et relancer Firefox/Iceweasel si nécessaire</li>
<li>Dans les modules complémentaires, vérifiez que le plugin apparaît bien (ou bien dans <kbd>about:plugins</kbd>)</li>
</ol>
<div id="attachment_1188" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-1188" title="Plugin Citrix vu depuis le gestionnaire de modules Firefox" src="http://case.oncle-tom.net/images/2008/10/citrix-plugin.png" alt="Plugin Citrix vu depuis le gestionnaire de modules Firefox" width="500" height="125" /><p class="wp-caption-text">Plugin Citrix vu depuis le gestionnaire de modules Firefox</p></div>
<h3>Conclusion</h3>
<p>Bref ça marche bien même sous Firefox 3 et j&#8217;en suis content. Le chargement des applications est relativement rapide. Ça fait presque bizarre de voir une application Windows bien se lancer !</p>
<p>C&#8217;est également la première fois que je peux me connecter à un VPN distant sans sérieux problèmes. J&#8217;ai déjà eu droit aux VPN Cisco à <em>passphrase</em> aléatoire généré par un badge &#8230; même le support technique n&#8217;a pas pu m&#8217;aider : j&#8217;étais le premier à les appeler en étant sous Linux !</p>
<div id="attachment_1187" class="wp-caption aligncenter" style="width: 295px"><img class="size-full wp-image-1187" title="Chargement de Citrix MetaFrame" src="http://case.oncle-tom.net/images/2008/10/citrix-loading-2.png" alt="Chargement de l'application Windows à distance" width="285" height="145" /><p class="wp-caption-text">Chargement de l&#39;application Windows à distance</p></div>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/connexion-serveur-citrix-firefox-linux/feed/</wfw:commentRss>
		<slash:comments>9</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>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>
	</channel>
</rss>

