<?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; xml</title>
	<atom:link href="http://case.oncle-tom.net/tag/xml/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>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>Migrer un flux RSS vers Feedburner</title>
		<link>http://case.oncle-tom.net/2007/migrer-un-flux-rss-vers-feedburner/</link>
		<comments>http://case.oncle-tom.net/2007/migrer-un-flux-rss-vers-feedburner/#comments</comments>
		<pubDate>Sat, 17 Mar 2007 12:00:31 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[xml]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2007/03/17/migrer-un-flux-rss-vers-feedburner/</guid>
		<description><![CDATA[Pour mesurer l&#8217;utilisation des flux RSS d&#8217;Emu Nova, j&#8217;ai décidé d&#8217;utiliser Feedburner dans sa version gratuite. Je l&#8217;utilise déjà pour ce blog et j&#8217;en suis très satisfait, que ce soit pour les données fournies, les personnalisations possibles ou encore la qualité du service. La problématique du jour : comment utiliser Feedburner sur des flux RSS [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img id="image510" src="http://case.oncle-tom.net/images/2007/03/feedburner-logo.gif" alt="Feedburner logo" /></p>
<p>Pour mesurer l&#8217;utilisation des <a href="http://www.emunova.net/infos/outils/">flux <acronym title="Really Simple Syndication">RSS</acronym> d&#8217;Emu Nova</a>, j&#8217;ai décidé d&#8217;utiliser <a href="http://www.feedburner.com/">Feedburner</a> dans sa version gratuite. Je l&#8217;utilise déjà pour ce blog et j&#8217;en suis très satisfait, que ce soit pour les <em>données fournies</em>, les <em>personnalisations possibles</em> ou encore la <em>qualité du service</em>.</p>
<p><em>La problématique du jour</em> : <strong>comment utiliser Feedburner sur des flux <acronym title="Really Simple Syndication">RSS</acronym> déjà existants</strong> ? Le changement doit être transparent pour les utilisateurs.<br />
<span id="more-511"></span></p>
<h3>Créer son flux Feedburner</h3>
<p>Avant de faire quoi que ce soit, il convient de créer son flux Feedburner à partir d&#8217;un flux déjà existant (qu&#8217;on souhaite rediriger tant qu&#8217;à faire). L&#8217;étape la plus simple.</p>
<p style="text-align:center"><img id="image512" src="http://case.oncle-tom.net/images/2007/03/feedburner-create-feed.png" alt="Création d'un flux Feedburner" /></p>
<h3>Modifier les liens vers les flux</h3>
<p>Une fois le flux créé, pensez à mettre à jour <strong>tous vos liens</strong> pointant vers ce fichier (balises &lt;link /&gt;, liens hypertextes, boutons personnalisés etc.). Ceci a pour but d&#8217;unifier toute les adresses et éviter qu&#8217;il y aient plusieurs adresses visibles pour accéder à la même information.</p>
<h3>Rediriger les flux existants</h3>
<p>Arrivé à ce stade, il faut bien comprendre que nous avons 2 cas de figure :</p>
<ul>
<li><strong>les anciens abonnés</strong> : ceux qui ont souscrit au flux avant que la modification précédente n&#8217;ait eu lieu. Le changement doit être transparent pour eux et ils ne doivent pas avoir à modifier la configuration de leurs agrégateurs actuels</li>
<li><strong>les nouveaux abonnés</strong></li>
</ul>
<p>L&#8217;intérêt est d&#8217;auditer <em>tous les abonnés</em> et donc pas seulement les nouveaux. C&#8217;est là que la redirection s&#8217;avère indispensable.<br />
On est bien d&#8217;accord qu&#8217;il faudrait créer une redirection renvoyant l&#8217;ancienne adresse du flux vers la nouvelle adresse (celle fournie par Feedburner).</p>
<p>Le plus simple consiste à créer un fichier <code>.htaccess</code> (ou d&#8217;éditer directement les directives de votre serveur virtuel) dans le même répertoire que celui du fichier <acronym title="eXtensible Markup Language">XML</acronym>. Il contiendrait ce code :</p>
<pre><code>RewriteEngine on
RewriteRule ^<strong>votreFlux</strong>\.xml$ http://feeds.feedburner.com/<strong>votreFluxFeedburner</strong> [R=301,L]</code></pre>
<p>On teste, ça marche. Un peu trop bien puisqu&#8217;en suivant ce principe, quiconque appelle la véritable <acronym title="Uniform Resource Locator">URL</acronym> de votre flux sera redirigé vers le flux Feedburner. Si en soi ça ne pose pas problème majeur, <em>ça l&#8217;est pourtant pour le robot d&#8217;indexation Feedburner</em> qui, lui, a besoin d&#8217;accéder au véritable flux pour en extraire les informations.</p>
<p>Feedburner ayant bien fait les choses, leur robot d&#8217;indexation se signale en envoyant une entête <a href="http://forums.feedburner.com/viewtopic.php?t=707"><em>User Agent</em> <code>FeedBurner/1.0 (http://www.FeedBurner.com)</code></a>. Ca tombe bien, il existe un <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond">filtre <code>RewriteCond</code> dans le module <em>mod_rewrite</em></a>. Ce dernier va nous servir à <strong>exclure le robot Feedburner de notre redirection</strong> précédente.</p>
<p>Juste au-dessus de notre <code>RewriteRule</code>, il suffit d&#8217;insérer la ligne suivante :</p>
<pre><code>RewriteCond %{HTTP_USER_AGENT} !FeedBurner</code></pre>
<p>L&#8217;utilisation de cette condition est d&#8217;ailleurs la seule raison pour laquelle une règle de réécriture a été employée en lieu et place d&#8217;un <code>RedirectPermanent</code>.<br />
<strong>Attention cependant</strong>, le <code>RewriteCond</code> est à spécifier à <em>chaque règle de réécriture</em>. La documentation est assez explicite à ce sujet : <strong>la condition n&#8217;est effective que pour une seule règle de réécriture</strong>.</p>
<h3>Le résultat final</h3>
<p>Et plutôt qu&#8217;un long discours, voici le résultat final obtenu pour <a href="http://www.emunova.net/">Emu Nova</a>. Les fichiers <acronym title="Really Simple Syndication">RSS</acronym> étaient placés dans le répertoire <code>go/rss/</code>. J&#8217;y ai donc placé un fichier <code>.htaccess</code> contenant le code suivant :</p>
<pre><code>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteRule ^news\.xml$ http://feeds.feedburner.com/emunovaNews [R=301,L]
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteRule ^veda\.xml$ http://feeds.feedburner.com/emunovaVedaTests [R=301,L]
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteRule ^veda_commentaires\.xml$ http://feeds.feedburner.com/emunovaVedaCommentaires [R=301,L]
</code></pre>
<p>Pas difficile et tellement pratique <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/2007/migrer-un-flux-rss-vers-feedburner/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

