<?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; api</title>
	<atom:link href="http://case.oncle-tom.net/tag/api/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>Paris-Web 2009 : le Web en offline avec Gears et HTML 5</title>
		<link>http://case.oncle-tom.net/2009/paris-web-2009-le-web-en-offline-avec-gears-et-html-5/</link>
		<comments>http://case.oncle-tom.net/2009/paris-web-2009-le-web-en-offline-avec-gears-et-html-5/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 10:00:42 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Standards du Web]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[gears]]></category>
		<category><![CDATA[google gears]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[Javascript]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1460</guid>
		<description><![CDATA[Paris-Web c'est chaque année une dose de bonheur en barre pour tous les professionnels du Web : conférences, ateliers et orateurs de qualité. Je rempile cette année en tant que spectateur et orateur, notamment pour un atelier technique présentant Gears, la boîte à outil du Web pour faire du <em>offline</em>.]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1461" title="Paris-Web 2009" src="http://case.oncle-tom.net/images/2009/10/pw2009-400x150-3.gif" alt="Paris-Web 2009" width="300" height="150" /><a href="http://www.paris-web.fr/">Paris-Web</a> est LE rendez-vous Web de l&#8217;année pour tous les professionnels intéressés par le webdesign, la qualité et l&#8217;accessibilité. <a href="http://www.paris-web.fr/2008/">L&#8217;édition 2008</a> (la première à laquelle j&#8217;assistais) m&#8217;a particulièrement plu alors je rempile cette année, à la fois en tant que spectacteur et orateur d&#8217;atelier technique.</p>
<h3><span id="more-1460"></span>Des conférences de choix</h3>
<p>Les thématiques abordées sont une nouvelle fois intéressantes. Si leur titre n&#8217;est pas forcément attirant, la qualité des intervenants fait qu&#8217;à n&#8217;en pas douter, on va encore en prendre plein les yeux : suffit de lire le <a title="Programme de Paris-Web 2009" href="http://www.paris-web.fr/2009/-Programme-">programme</a>.</p>
<p>Parmi celles qui retiennent toute mon attention :</p>
<ul>
<li><strong>Intégrateurs, montez au front !</strong><br />
Notamment parce que j&#8217;ai participé à l&#8217;enquête sur le dialogue entre webdesigner et intégrateur et qu&#8217;il s&#8217;agit d&#8217;une pierre angulaire de la réussite graphique d&#8217;un projet.</li>
<li><strong>Un seul Web</strong><br />
Car l&#8217;an dernier j&#8217;avais été épaté par la présentation des nouveautés CSS3 de <a href="http://www.glazman.org/weblog/">Daniel Glazman</a>.</li>
<li><strong><acronym title="Cascading Style Sheets">CSS</acronym> peut-il être orienté objet ?</strong><br />
Parce que je crois beaucoup aux nouvelles méthodes de réutilisation et de conception <acronym title="Cascading Style Sheets">CSS</acronym> ; cette approche combinée à d&#8217;autres outils <acronym title="Cascading Style Sheets">CSS</acronym> est à mon avis la meilleure qui soit.</li>
<li><strong>CSS3 : Future Style Now</strong><br />
Parce qu&#8217;il est toujours bon de savoir comment utiliser les technos que l&#8217;on utilisera dans pas trop longtemps.</li>
<li><strong>WCAG 2.0, Flash, <acronym title="Portable Document Format">PDF</acronym>, Javascript et les autres sont dans un bateau</strong><br />
Une bonne piqûre de rappel sur l&#8217;accessibilité et les différentes boîtes noires qui sont devenus des standards <em>de facto</em>.</li>
<li><strong>Les nouveaux standards du web et leur implémentation dans les navigateurs modernes</strong><br />
Le titre parle de lui-même <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
<p>C&#8217;est sans compter sur les ateliers techniques où là, je n&#8217;ai pas encore fait mon choix &#8230; la concurrence est rude <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Atelier technique sur Gears</h3>
<p>Il y a toutefois un atelier où je suis sûr d&#8217;être présent, c&#8217;est celui-ci : <strong>le Web en Offline avec Gears et <acronym title="HyperText Markup Language">HTML</acronym> 5</strong>, à 14h00 pour la digestion <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Et pour cause, je l&#8217;animerai &#8230; enfin, encore faut-il que j&#8217;en termine la présentation. En voici la description officielle :</p>
<blockquote><p><a class="spip_out" href="http://tools.google.com/gears/">Gears</a> est un outil Open Source, majoritairement connu pour permettre à une page Web d’être consultable en étant déconnecté du réseau. Ce plugin pour navigateur Web propose pourtant d’autres briques utiles dans d’autres contextes, notamment les performances et le traitement d’un nombre important de données. C’est un outil unique permettant de créer des applications fonctionnelles hors-ligne et cross-brower sans avoir à recours à du client lourd (type application iPhone).</p>
<p>La présentation se focalisera sur la présentation des composants, des exemples d’utilisation mais aussi sur les contraintes et les choix de stratégie à adopter dans son code pour éviter la création d’usines à gaz.</p>
<p>L’atelier concluera sur l’avenir et <acronym title="HyperText Markup Language">HTML</acronym> 5 dans la mesure où les travaux de Gears sont désormais intégrés à la spécification <acronym title="HyperText Markup Language">HTML</acronym> 5.</p></blockquote>
<p>Mais globalement, l&#8217;atelier s&#8217;articulera autour des points suivants :</p>
<ul>
<li>présentation des modules de Gears</li>
<li>contraintes d&#8217;ergonomie</li>
<li>implications en terme d&#8217;architecture de code</li>
<li>débat ouvert avec l&#8217;assemblée</li>
</ul>
<p>Le choix sera difficile avec en même temps un atelier de David Larlet et Charles McCathieNeville &#8230; où j&#8217;aurais aimé également être présent.</p>
<p>À samedi &#8230; et jeudi et vendredi pour d&#8217;autres <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/2009/paris-web-2009-le-web-en-offline-avec-gears-et-html-5/feed/</wfw:commentRss>
		<slash:comments>6</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>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>Quand Jaiku surpassera Twitter</title>
		<link>http://case.oncle-tom.net/2008/quand-jaiku-surpassera-twitter/</link>
		<comments>http://case.oncle-tom.net/2008/quand-jaiku-surpassera-twitter/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 05:00:04 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[jaiku]]></category>
		<category><![CDATA[micro-blogs]]></category>
		<category><![CDATA[plurk]]></category>
		<category><![CDATA[pownce]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=934</guid>
		<description><![CDATA[Cela fait maintenant plus d&#8217;1 an que j&#8217;utilise Twitter. Passée l&#8217;appréhension du gadget puéril, je l&#8217;ai finalement converti en outil de communication, de réseautage et de veille &#8230; comme beaucoup de ses utilisateurs d&#8217;ailleurs. Seulement voilà, les pannes à répétition sont, à mon sens, en train de ruiner un service qui aurait pu être encore [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://case.oncle-tom.net/images/2008/06/logo-jaiku.png"><img class="size-full wp-image-938" title="Logo Jaiku" src="http://case.oncle-tom.net/images/2008/06/logo-jaiku.png" alt="Logo Jaiku" width="89" height="73" /></a></p>
<p><a href="http://case.oncle-tom.net/2007/06/01/twitter-gtwitter/">Cela fait maintenant plus d&#8217;1 an que j&#8217;utilise Twitter</a>. Passée l&#8217;appréhension du gadget puéril, je l&#8217;ai finalement converti en <strong>outil de communication</strong>, de <strong>réseautage</strong> et de <strong>veille</strong> &#8230; comme beaucoup de ses utilisateurs d&#8217;ailleurs.</p>
<p>Seulement voilà, les pannes à répétition sont, à mon sens, en train de ruiner un service qui aurait pu être encore plus ravageur qu&#8217;il ne l&#8217;a été. Plusieurs concurrents s&#8217;y sont essayés, aucun ne l&#8217;a encore détrôné.</p>
<p>À part peut-être <a href="http://jaiku.com/">Jaiku</a>, si Google réussit son coup.</p>
<p><span id="more-934"></span></p>
<h3>Jaiku, Twitter : micro-blogs et/ou messagerie instantanée délocalisée</h3>
<p>Entre messagerie instantanée asynchrone et micro-blogs, mon cœur balance.</p>
<p>Toutefois le dénominateur commun de <em>Twitter</em>, <em>Jaiku</em>, <a href="http://plurk.com/">Plurk</a>, <a href="http://pownce.com">Pownce</a> et toute la clique ce sont les <strong>messages en 140 caractères adressés au monde entier</strong>.<br />
En soi c&#8217;est assez amusant de constater que cette limite a été adoptée pour tenir sur 1 SMS (tant en envoi qu&#8217;en réception) &#8230; alors que nous sommes sur le Web. Cet exercice aura le mérite de favoriser le partage d&#8217;<acronym title="Uniform Resource Locator">URL</acronym> et d&#8217;améliorer l&#8217;esprit de synthèse de beaucoup.</p>
<p>Malgré tout mon enthousiasme pour <em>Twitter</em>, je n&#8217;ai pour l&#8217;instant envie que d&#8217;une chose : un service stable. Autrement dit :</p>
<ul>
<li>des flux <acronym title="Really Simple Syndication">RSS</acronym> / une <acronym title="Application Programming Interface">API</acronym> qui répond 99,9% du temps : quand je regarde mes twit une fois par heure et que je constante une désespérante &laquo;&nbsp;erreur inconnue&nbsp;&raquo; dans le widget Netvibes &#8230; no comment</li>
<li>un service qui ne s&#8217;effondre pas une page sur 2 en plein milieu de journée</li>
<li>un service qui communique sur ses problèmes : déjà 3 semaines que le client <acronym title="Instant Message">IM</acronym> est hors-ligne. C&#8217;est pourtant le <a href="http://www.readwriteweb.com/archives/top_twitter_clients_definitive_list.php">deuxième client Twitter le plus utilisé</a></li>
</ul>
<h3>Pourquoi Jaiku est mieux que Twitter</h3>
<p>Jaiku ne bénéficie pas du même engouement que Twitter, peut-être pas à tort. Son adoption a été fortement freinée par le rachat de Google en 2007. Ce rachat a placé Jaiku en inscription sur invitation.<br />
Parallèlement à ça, très peu de nouveautés ont fait leur apparition sur le service.</p>
<p>Et avec ça je tente de vous convaincre que Jaiku est mieux ? Et pourtant :</p>
<p style="text-align: center;"><img class="size-full wp-image-936" title="Flux Flickr sur Jaiku" src="http://case.oncle-tom.net/images/2008/06/jaiku-flickr.png" alt="Flux Flickr sur Jaiku" width="399" height="81" /></p>
<ul>
<li><strong>automatisation de l&#8217;intégration de vos flux</strong> (<acronym title="Really Simple Syndication">RSS</acronym>, Twitter, Last.fm etc.) avec une présentation des plus sympathiques (exemple ci-dessus avec <a href="http://case.oncle-tom.net/2008/03/18/flickr-le-site-ideal-pour-partager-ses-photos/">Flickr, mon service photo préféré</a>)</li>
<li>une <strong>interface Web beaucoup plus agréable</strong> : identification facile des source des données, différenciation de nos messages et des flux aggrégés, filtrage des sources de flux</li>
<li>une <strong><acronym title="Application Programming Interface">API</acronym> plus sécurisée</strong> : <a href="http://www.codinghorror.com/blog/archives/001128.html">parce qu&#8217;il ne faut jamais, ô grand jamais donner son mot de passe</a>, cette hérésie est remplacée par une clé unique (mais malheureusement pas regénérable)</li>
<li>les &laquo;&nbsp;channels&nbsp;&raquo; ou <strong>groupes de discussion</strong>. Ils facilitent la création de conversation liées à une thématique ou à des sites/services Web. Pratique pour éviter la schizophrénie du multi-compte.</li>
</ul>
<h3>Pourquoi Twitter est mieux que Jaiku</h3>
<p>Malgré tout, Twitter possède une bonne avance, notamment grâce à son énorme base d&#8217;utilisateurs :</p>
<ul>
<li><strong>immense parc d&#8217;applications</strong>, tant en terme de mashups que de clients pour twitter. Au hasard : <a href="http://www.twitbin.com/">TwitBin</a>, <a href="http://www.twhirl.org/">Thwirl</a>, <a href="http://twittervision.com/">TwitterVision</a>, <a href="http://summize.com/">Summize</a>, <a href="http://www.phoreo.com/twittershare/">TwitterShare</a>, <a href="http://twitlinks.com/">TwitLinks</a> etc.</li>
<li>une <strong><acronym title="Application Programming Interface">API</acronym> simple et complète</strong> (mais du coup, pas sécurisée : donner son mot de passe n&#8217;est pas recommandable)</li>
<li>une <strong>prise en main immédiate</strong> : pas de fioriture, tout est simple</li>
<li><strong>fonctionnalité de veille</strong> sympathique : &laquo;&nbsp;track&nbsp;&raquo;. Recevez tous les twit qui contiennent tel ou tel mot</li>
<li>affichage affiné avec la possibilité de n&#8217;afficher que les réponses qui nous sont faites (<em>@replies</em>)</li>
</ul>
<h3>Comment Jaiku peut surpasser Twitter</h3>
<p style="text-align: center;"><a href="http://case.oncle-tom.net/images/2008/06/jaiku-overview.png"><img class="size-medium wp-image-937" title="Vue d'ensemble de Jaiku" src="http://case.oncle-tom.net/images/2008/06/jaiku-overview-300x159.png" alt="Vue d'ensemble de Jaiku" width="300" height="159" /></a></p>
<p>Twitter conserve fonctionnellement pas mal d&#8217;avantages qui justifient encore son utilisation et sa forte adoption. C&#8217;est en subissant les pannes répétées et en lisant plusieurs articles, dont «<a href="http://www.readwriteweb.com/archives/can_twitter_be_saved.php">Can Twitter Be Saved</a>» que j&#8217;ai sérieusement mis en doute la <strong>capacité à Twitter à accompagner ses utilisateurs</strong> de manière pérenne.</p>
<p>Jaiku n&#8217;avance plus certes mais en surface uniquement. Si Google est malin tout autant que les créateurs de Jaiku, ils ont toutes les clés pour détrôner Twitter et transformer l&#8217;essai.<br />
Voici ce que j&#8217;aurais aimé voir sur Jaiku pour migrer définitivement dessus :</p>
<ul>
<li>une <strong>interface internationalisée</strong> (<acronym title="internationalisation">i18n</acronym>) pour faciliter l&#8217;adoption dans tous les pays et éviter de laisser l&#8217;outil entre les mains des seuls geeks</li>
<li>intégration d&#8217;un ou plusieurs outils au choix de <strong>compression d&#8217;<acronym title="Uniform Resource Locator">URL</acronym></strong>, comme <a href="http://is.gd">is.gd</a> ou <a href="http://tinyurl.com">tinyurl</a></li>
<li><strong>import de contacts</strong> depuis Facebook, Twitter et pourquoi pas, son carnet d&#8217;adresse Gmail (<a title="Google Contacts API" href="http://code.google.com/apis/contacts/">par l&#8217;<acronym title="Application Programming Interface">API</acronym></a> bien sûr)</li>
<li><strong>forte intégration dans Google</strong> (Google News, Google Alerts, Gmail, Google Calendar, Google Talk/Jabber, iGoogle et widgets etc.)</li>
<li><strong>utilisation de l&#8217;infrastructure Google</strong> (on parle d&#8217;<a href="http://code.google.com/appengine/">App Engine</a> entre autre)</li>
</ul>
<p>Après, ma seule crainte ce sont les <a href="http://case.oncle-tom.net/2008/03/11/google-ange-demon-vie-numerique/">habituels travers de Google, abandon de service, manque de suivi et opacité de service</a>.</p>
<p>Je garde bon espoir pour Jaiku. À tel point que je suis même en train de produire un <a title="widget Netvibes pour Jaiku" href="http://case.oncle-tom.net/code/netvibes/">widget Netvibes</a> pour <em>Jaikuter</em> depuis n&#8217;importe où <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/quand-jaiku-surpassera-twitter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

