La syndication de contenus

Le système de syndication (voir l’article « Les fichiers backend ») s’enrichit : il est désormais possible d’échanger l’adresse des documents joints aux articles (podcasting), de transporter d’un site à l’autre les mots-clés (tags) associés aux articles ainsi que leur rubrique (ou catégorie). On peut aussi, si on le désire, syndiquer le contenu intégral des articles.

Dans tout ce qui suit, on considère que le flux de syndication offert par le site source est suffisamment riche pour avoir prévu toutes les possibilités qu’offre notamment le squelette dist/backend.html de SPIP.

Référencement rapide du site

On repère d’abord sur le site source l’URL de son flux de syndication au format RSS (ou Atom). Selon les cas, cette adresse est indiquée directement sur la page, et/ou est « découverte » automatiquement par le navigateur, qui affiche alors une icône caractéristique. Si les squelettes du site source le prévoient, SPIP peut aussi découvrir cette adresse de syndication, et il suffit d’indiquer l’adresse du site pour se voir proposer de le syndiquer.

Une fois la syndication activée, les articles présents dans le flux de syndication du site source sont repris sur le site récepteur.

Décider ce que l’on veut émettre

Le webmestre du site source peut décider de ce qu’il met dans son flux RSS : ce choix peut bien évidemment se faire en modifiant le squelette dist/backend.html, ou en s’en inspirant pour créer un nouveau flux.

Mais la page de configuration dans l’espace privé propose une option très importante pour la syndication : elle permet de décider si le flux RSS du site comportera l’intégralité du contenu des articles, au format HTML, ou seulement un petit résumé (au format texte). Dans le premier cas (qui est la configuration par défaut du système), les articles récents du site sont entièrement lisibles avec un lecteur RSS : ils sont aussi entièrement « recopiables » d’un site à l’autre. Cela permet par exemple de réaliser automatiquement des sites miroirs, ou des sites composés d’un contenu produit sur d’autres sites.

Décider ce que l’on veut récupérer

Si le site source ne diffuse pas son contenu intégral, il est bien évident que la syndication ne pourra pas en récupérer plus. Mais dans le cas d’une diffusion intégrale, SPIP peut récupérer ce contenu HTML et l’afficher, images comprises.

Site par site, on peut choisir ce que l’on veut récupérer par la syndication : le contenu HTML des articles (issu de l’entrée <content> du flux RSS, si elle y est présente) ou un simple résumé au format texte (trouvé dans l’entrée <description> ou <summary> du flux rss).

On peut également décider de ce que l’on fait des articles qui disparaissent des flux (qui sont en général limités aux 15 articles les plus récents du site) : on peut décider que SPIP les élimine de la base de données (après une période de deux mois), et/ou les passe immédiatement en mode « refusé ». Ces dernières options permettent par exemple de gérer un portail sur des flux très rapides (agences de presse, tags très populaires de sites de photographie, etc) ; ou encore de maintenir un miroir fidèle d’un site (en éliminant les articles qui seraient dépubliés).

SPIP considère que si la date d’un élément de flux RSS est « très vieux » (plus d’un an) ou trop loin dans le futur (plus de 48 heures), c’est qu’il s’agit probablement d’une erreur. Il inscrit donc la date du jour à la place de celle qu’il a trouvé. On pourrait avoir besoin, cependant, de syndiquer des informations qui, à dessein, fournissent une date située à plus de 2 jours dans le futur. Par exemple, on peut se servir de fils RSS pour annoncer des évènements qui auront lieu dans le futur.

Pour syndiquer ses rendez-vous via le flux RSS dédié, une variable de personnalisation nommée $controler_dates_rss, qui vaut vrai par défaut.

Pour cela, dans votre fichier config/mes_options.php, ajouter la ligne

$GLOBALS['controler_dates_rss'] = false;

le test n’est plus effectué et les dates du futur, ou du « lointain » passé, seront bien prises en compte.

Décider ce que l’on veut afficher

La boucle SITES permet de parcourir les sites syndiqués, tandis que la boucle SYNDIC_ARTICLES permet de récupérer les champs descriptifs des articles fournis par l’un des sites syndiqués

-  la source :

De manière habituelle, #NOM_SITE représente le nom du site syndiqué, qui est donc la « source » de l’article. Cependant avec le développement des agrégateurs de contenu (les portails par exemple), la véritable source de l’article peut être un autre site. Le format RSS a prévu ce cas en définissant un champ <source> indiquant la véritable source de l’article. Le moteur de syndication de SPIP récupère ces données quand elles sont présentes, et les balises #SOURCE et #URL_SOURCE permettent d’afficher respectivement le nom et l’adresse de la source.

-  les tags :

Si les mots-clés affectés aux articles sont correctement renseignés dans le flux RSS, ils sont récupérés par le site récepteur ; ils n’arrivent pas individuellement dans la table des mots-clés, mais sont stockés en vrac dans le champ tags de la table spip_syndic_articles.

Si le flux de syndication utilise la notation standard <dc:subject>Tag</dc:subject>, le tag est noté tel quel. SPIP pousse cette notion un peu plus loin en transmettant aussi l’adresse de la page du mot-clé, grâce aux microformats. Le tag est alors récupéré avec son lien, sous la forme :
<a rel="tag" href="adresse de la page du mot-clé">Mot-clé</a>.

Sur le site destinataire, ces tags sont affichés dans l’espace privé sous le descriptif de l’article, et sont affichables sur le site public grâce à la balise #TAGS (on verra plus loin comment la filtrer pour faire un affichage sélectif des tags).

Note : SPIP prévoit une gestion spécifique des tags en provenance du site flickr (photographie) de manière à pouvoir leur attribuer un URL qui n’est pas prévu dans son flux RSS.

-  la rubrique :

Dans de nombreuses applications (systèmes de blogs, répertoire de liens...) la catégorie (ou encore directory) d’un article est l’équivalent de ce que SPIP appelle la rubrique. Il était donc naturel d’utiliser la notion RSS standard de <category>...</category> pour faire connaître l’appartenance de notre article à telle ou telle rubrique.

De même qu’avec les tags, SPIP récupère cette information et l’affiche via #TAGS.

-  les documents joints :

Les documents qui, dans l’espace privé, figurent en bas de la page de visualisation d’un article, soit dans la section « Documents » soit, pour les images, dans la section « Portfolio », sont eux aussi transmis dans le flux RSS, en utilisant la notion <enclosure ... />. C’est ce qu’on appelle le podcasting, désormais une fonction standard de SPIP [1].

L’information sur les enclosures est elle aussi récupérée dans la balise #TAGS, mais elle est affichée de façon différenciée dans l’espace privée, sous forme d’un petit trombone pour chaque fichier.

Utiliser la balise #TAGS

Comme on l’a vu ci-dessus, la balise #TAGS affiche en vrac les liens vers les mots-clés, la rubrique et les documents joints. Mais par la grâce des microformats, les liens vers chacun de ces concepts sont « marqués » de la façon suivante :
-  <a rel="tag" ...> pour les tags/mots-clés
-  <a rel="directory" ...> pour la rubrique/catégorie
-  <a rel="enclosure" ...> pour les documents joints/podcast

Si l’on veut n’afficher que l’un de ces types de tags, on utilisera le filtre afficher_tags en précisant le type souhaité en argument :

[(#TAGS|afficher_tags{directory})]
[(#TAGS|afficher_tags{tag})]
[(#TAGS|afficher_tags{enclosure})]

Par défaut [(#TAGS|afficher_tags)] est équivalent à [(#TAGS|afficher_tags{'tag,directory'})].

Pour les documents joints, le filtre spécifique afficher_enclosures permet d’afficher les trombones plutôt que des liens classiques :

[(#TAGS|afficher_enclosures)]

* *

Manipuler le contenu HTML des articles syndiqués

Cas pratique : notre site syndique un photoblog, qui diffuse systématiquement un petit commentaire suivi de la photographie. Cette dernière se présente sous la forme d’une balise HTML <img .../>. Une fois ce photoblog syndiqué en version HTML complète dans notre site, nous pouvons décider de n’afficher que la photo, sans le commentaire. Il nous faut alors extraire la balise <img /> ; cela peut se réaliser grâce au filtre extraire_balise{xxx}, qui récupère la première balise HTML <xxx /> d’un contenu.

A partir de là tout est possible :

[(#DESCRIPTIF|extraire_balise{img})]

…affiche la photo ;

[(#DESCRIPTIF|extraire_balise{img}|extraire_attribut{src})]

…son URL ;

[(#DESCRIPTIF|extraire_balise{img}|extraire_attribut{width})]

…sa largeur ;

On peut même en modifier le style avec, par exemple :

[(#DESCRIPTIF|extraire_balise{img}|inserer_attribut{style,'border: double red 4px;'})]

Remarque : les contenus HTML provenant d’un site extérieur sont par définition considérés comme « non contrôlés », et donc potentiellement problématiques s’ils contiennent des balises mal fermées, ou du javascript ; SPIP leur applique donc systématiquement le filtre safehtml avant affichage.

Autres filtres liés à la syndication

Ces filtres permettent de convertir les tags de syndication d’un format à un autre, afin de pouvoir par exemple remettre au format RSS des « tags » récupérés par syndication, et enregistrés dans notre base de données sous forme de microformats : tags2dcsubject, enclosure2microformat, microformat2enclosure.

Références

-  microformats
-  rel=tag
-  rel=enclosure
-  rel=directory

Notes

[1Attention les fichiers eux-mêmes ne sont pas recopiés : seules leur URL et les données associées (titre, taille, format) sont récupérées. Par ailleurs il faut signaler, pour les puristes, qu’on prend ici quelque liberté avec la norme RSS, qui interdit normalement d’avoir plusieurs enclosures dans un même article.

Auteur Fil Publié le : Mis à jour : 19/10/23

Traductions : عربي, català, English, Español, français, italiano, Nederlands, Türkçe