<?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; tinymce</title>
	<atom:link href="http://case.oncle-tom.net/tag/tinymce/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>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>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>
	</channel>
</rss>

