Plugin « Syndiquer par mot-clef ou par langue » (spip 1.9)

MàJ pour 1.9 / 1.9.1 / 1.9.2 alpha et pluginisation d’une « bidouille » créée à l’origine pour un spip 1.7.2

Attention ! Cette contribution modifie des fichiers du noyau de SPIP !

Même si elle a été testée par plusieurs utilisateurs nous ne pouvons garantir qu’il n’y aura pas d’effets secondaires dommageables sur votre SPIP. Conservez toujours les fichiers d’origine pour pouvoir revenir au noyau originel.

De plus, elle n’est compatible qu’avec une version précise de SPIP et sera perdue à la prochaine mise à jour : vous devrez donc recommencer.

La distrib standard offre la possibilité de syndiquer des sites rubrique par rubrique. Au prix d’une courte modif, on peut avoir une syndication en fonction d’un mot-clef ou de la langue de rédaction des articles. Si vous préférez, vous pouvez tester l’effet produit (strictement identique) en installant la version ’plugin’ qui est jointe à cet article.

[*La modif de backend.html et de exec/synchro.php *]


situation

Je gère un site « maman_poule » dans lequel je souhaite faire apparaître les productions de sites « poussins ».

Problème : les contenus des différentes rubriques de ces sites ne sont pas tous exempts de... scories (les productions des poussins en difficultés sont parfois surprenantes... dans leur diversité) et le nombre de rubriques y est volontairement restreint.

Dans ces conditions, décider de syndiquer c’est donc choisir entre tout-ou-rien et/ou bloquer-débloquer les liens un par un tous les soirs...

solution proposée : syndiquer les mot-clef

préparation :

  • 1/ sur chaque site poussin, je crée si ce n’est déjà fait un dossier « squelettes » à la racine du site
  • 2/ je recopie le « backend.html » du dossier « dist » dans mon dossier « squelettes »
  • 3/ dans le dossier squelettes, je renomme backend.html en backend-mots.html

ensuite,

  • 4/ j’édite backend-mots.html :

je remplace

BOUCLE_10recents(ARTICLES) {lang ?}{branche ?}{id_mot ?}{par date}{inverse}{0,10}{unique}

par

BOUCLE_10recents(ARTICLES) {lang ?}{id_mot ?}{par date}{inverse}{0,10}{unique}

ainsi que

BOUCLE_tres_recents(ARTICLES){lang ?}{branche ?}{id_mot ?}{par date}{inverse}{age<3}{unique}

par

BOUCLE_tres_recents(ARTICLES){lang ?}{id_mot ?}{par date}{inverse}{age<3}{unique}

    • Quelques explications...
      • Dans la version d’origine, le critère branche retourne l’ensemble des articles de la rubrique ET de ses sous-rubriques. Comme il n’est pas possible d’appeler directement une branche en faisant par exemple branche=42 on passe la valeur de branche via l’environnement lors de l’appel de la fonction.
      • Dans la version modifiée, s’agissant de mots-clefs et plus de rubriques, on pourrait écrire l’ID du mot clef qui nous intéresse « en dur » mais ça ne serait guère souple. Il est bien plus facile d’utiliser là encore le «  ? », c’est à dire de faire une boucle générique puis, lors de l’appel de celle-ci, d’indiquer la valeur à mettre dans notre variable d’environnement.

  • 5/ enfin, je sauvegarde le tout et l’uploade en ftp sur le site poussins
  • 6/ Là, je note le numéro d’id (xxx) du mot que je veux syndiquer (www.le_site_poussin.net/spip.php ?motxxx)
  • 7/ puis, dans le site « maman_poule », je syndique le site poussin avec un lien vers "spip.php ?page=backend-mots&id_mot=xxx
Syndication par Mot_clef
l’adresse à saisir pour syndiquer un « site poussin » en fonction d’un mot-clef connu

pour aller un chouillat plus loin

Nous allons rendre la sélection de ces nouveaux backend accessibles aux rédacteurs sans avoir à noter de n° d’id sur un bout de papier...

Maintenant que mon fichiers backend-mot.html est sur chaque site « poussin », il convient d’informer les rédacteurs de cette nouvelle possibilité. On va leur permettre de faire du copier/coller :

  • 8/ J’édite donc maintenant le fichier ecrire/exec/synchro.php

je repère la ligne « fin_cadre_relief() ; »

et juste au-dessus je colle :

///
/// Syndication par mot-clef
/// Suivi par RSS des différents "thèmes" disponibles
///

debut_cadre_relief("site-24.gif", false, "", _T('ical_titre_rss'));

/// suivi RSS par mot clef 
/// chez nous le groupe des mots-clefs syndiqué = groupe 8
/// à faire : remplacer le blabla par une chaine dans le fichier lang
echo "<p>"._L("Vous pouvez aussi limiter la syndication aux th&egrave;mes qui vous int&eacute;ressent :")."</p>";


// la partie importante
$query = "SELECT * FROM spip_mots WHERE id_groupe=\"8\" ORDER BY titre";
$result = spip_query($query);

		if (spip_num_rows($result) > 0) {
			echo "<ul>";

		 	 while($row=spip_fetch_array($result)){
		    	 $id_mot=$row['id_mot'];
		    	 $titre_mot = typo($row['titre']);
				 $titre = htmlspecialchars($titre_mot);
   					echo "<li>", http_href( generer_url_public('backend-mots', "id_mot=$id_mot"), 
					http_img_pack( 'feed.png', 'RSS', ' border="0" ') .'&nbsp; '.
					$titre_mot, $titre),
					"</li>\n";
		     }
		  echo "</ul>";
		}	
fin_cadre_relief();
// fin du hack

enfin, je sauvegarde le tout et l’uploade en ftp sur les sites « poussins » et sur le site « maman_poule ». Désormais, le rédacteur de passsage pourra accèder à la liste de nos « mots-clefs syndiqués » :

Syndication par mot-clef
l’utilisateur peut choisir de ne syndiquer qu’un thème particulier

Aller encore plus loin : la syndication par langue de rédaction

Revenons en arrière et reprenons notre fichier backend-mots.html ; on y découvre que les boucles peuvent réagir à deux critères : non seulement le critère « id_mot » (qui nous a servi pour la syndication par mot-clef) mais aussi le critère « lang ».
Nous tenons ici la possibilité de créer facilement une autre forme de syndication reposant, celle-ci sur la langue de rédaction des articles.

je repère donc la ligne « fin_cadre_relief() ;// fin du hack »
et juste en dessous, je colle :

///
/// Syndication selon la langue de rédaction des articles
///

debut_cadre_relief("site-24.gif", false, "", _L('Syndication selon la langue des articles'));

echo "<p>"._L("Vous pouvez aussi limiter la syndication aux articles d'une certaine langue.")."</p>";
echo "<p>"._L("Actuellement dans ce site, il y a des articles r&eacute;dig&eacute;s en :")."</p>";

$query = "SELECT DISTINCT lang FROM spip_articles";
$result = spip_query($query);

		if (spip_num_rows($result) > 0) {
			echo "<ul>";

		 	 while($row=spip_fetch_array($result)){
		    	 $lang=$row['lang'];
   					echo "<li>", http_href( generer_url_public('backend-mots', "lang=$lang"), 
					http_img_pack( 'feed.png', 'RSS', ' border="0" ') .'&nbsp; '.
					$lang, $lang),
					"</li>\n";
		     }
		  echo "</ul>";
		}
fin_cadre_relief();
// fin du hack

L’oeil averti relèvera la syntaxe de notre requête MySql dans laquelle le critère DISTINCT nous permet l’économie d’un tas de code. En effet, cette simple instruction permet, comme son nom l’indique, de ne ramener QUE les langues différentes.

l’utilisateur peut ne syndiquer que les articles rédigés dans une certaine langue
il suffit de cliquer sur la langue voulue et la syndication se met en place.

[*La mise en Plugin*]


Considérations de départ

Bidouiller un fichier de ecrire/exec, comme nous venons de le faire ci-dessus, c’est bien. Le problème, c’est qu’en cas de mise à jour de la distrib spip, il faut se souvenir du (ou des) fichiers qu’on a modifié pour ne pas les écraser. La mise en « plugin » permet tout d’abord d’éviter ce genre problème. _ En outre, les plugins peuvent être à volonté activés / désactivés, ce qui évite bien des manip fastidieuses.
Alors... on y retourne !

Récupérer un modèle

Pour commencer, nous allons récupérer un modèle de plugin sur svn ://zone.spip.org/spip-zone/ (le « plugin_template »). C’est en éditant son contenu et en virant ce qui ne nous est pas utile qu’on va créer notre plugin connexion.

Editer plugin.xml

Ce fichier est fourni avec des indications assez claires sur sa structure. Pour l’essentiel, il suffit donc de mettre le nom du plugin, celui de l’auteur, la version et la description dans les balises du même nom.

Les éléments plus « sensibles » sont :

    • la balise « options »
      Le documentation indique que le fichier options (comme l’ancien mes_options.php) sera chargé a chaque hit. C’est donc bien à elle que nous devons nous atteler puisque, si nous voulons savoir quels sont les mots-clefs ’syndicables’, il faut recalculer.
      La balise « options » prendra donc la forme suivante :
      <options>
      synchronisation_par_mots_clefs_options.php
      </options>

      Bien sûr, comme indiqué dans la doc, nous inventons pour ce fichier un nom unique (surtout pas mes_options.php). C’est dans ce fichier « synchronisation_par_mots_clefs_options.php » que nous copierons tout simplement la totalité de notre fichier ecrire/exec/synchro.php modifié (tout simplement).

    • La balise « fonctions » :
      Comme nous n’en avons pas besoin, elle restera vide. On peut aussi la supprimer tout simplement.
    • La balise « prefixe » :
      Là encore la doc fournit des indications précises et claires : pas d’ambiguité dans le nom qui doit être unique et sera repris dans toutes nos fonctions. Ici on reste simple :
      <prefix>
      synchronisation_par_mots_clefs
      </prefix>
    • La balise « pipeline » :
      C’est le coeur du truc. C’est le pipeline, aussi appelé point d’entrée, qui nous permet d’altérer le fonctionnement standard de spip. La liste des pipelines déjà prévus dans spip peut être étudiée dans inc_version. Là, comme nous cherchons à altérer le fonctionnement d’un fichier de ecrire/exec en entier, nous allons retenir uniquement le pipeline « body_prive ».
      <pipeline>
      	<nom>body_prive</nom> 
      	<action>body_prive</action>
      	<inclure>synchronisation_par_mots_clefs_pipelines_admin.php</inclure>
      </pipeline>


      La doc indique que l’on peut se dispenser de « inclure ». Nous allons néanmoins indiquer expressément le nom de ce fichier (et tout de suite après l’éditer).

Editer « template_pipelines_admin.php »


Avant d’aller plus loin, nous renommons ce fichier sous le nom que nous avons indiqué dans plugin.xml, c’est à dire « synchronisation_par_mots_clefs_pipelines_admin.php ».
En l’éditant, nous découvrons que plusieurs fonctions ont été prévues. La plupart ne nous servant à rien, nous les effaçons pour arriver au code suivant :

<?php
function synchronisation_par_mots_clefs_body_prive($flux){
	return $flux;
}
?>

Editer « template_options.php »

Avant d’aller plus loin, nous renommons ce fichier sous le nom que nous avons indiqué dans plugin.xml, c’est à dire « synchronisation_par_mots_clefs_options.php ».
En l’éditant, nous découvrons... qu’il est vide !
Super !
On va y copier/coller la totalité du fichier ecrire/exec/synchro.php que nous avons modifié selon nos besoins dans la première partie de cet article.

Et ensuite ?

et ensuite,... c’est fini (ou presque). Nous pouvons effacer les fichiers templates qui ne servent à rien dans notre cas (template_fonctions, template_pipelines_cron, template_pipelines_typo et template_pipelines_public).
Nous avons donc un plugin tout neuf composé de 4 fichiers :

    • gpl_fr.txt : (pour la license)
    • plugin.xml
    • synchronisation_par_mots_clefs_pipelines_admin.php
    • synchronisation_par_mots_clefs_options.php

Si ce n’est déjà fait, on crée un dossier « plugins » à la racine du spip. On y crée ensuite un sous-dossier « synchronisation_par_mots_clefs » (ou ce que vous voulez, a priori ça n’est pas critique). On y glisse nos quatre fichiers.

Rajouter le fichier "backend-mots.html

Pour que tout fonctionne comme prévu, il ne nous reste plus qu’à recopier le fichier ’backend-moots.html’ dans le répertoire de notre plugin, au même niveaux que nos quatres fichiers.

Pour faire fonctionner la chose

Dans l’interface privée, les bouton « Configuration » fait alors apparaître un « Gestion des plugins » qui nous permet d’activer notre plugin. On s’en rend compte aussitôt en allant sur la page « Suivre la vie du site » dont le fonctionnement est désormais modifié tant que le plugin est activé.

Discussion

4 discussions

  • 1
    Hada de La Luna

    Bonjour,  ;o)

    J’ai mis ce très intéressant plugin dans le dossier plugins d’un Spip 1.9.2b...

    J’ai activé le plugin...

    Et dans le backend, il s’affiche :

    Syndication par mot-clef

    Vous pouvez aussi limiter la syndication aux thèmes qui vous intéressent :

    Syndication selon la langue des articles

    Vous pouvez aussi limiter la syndication aux articles d’une certaine langue.

    Actuellement dans ce site, il y a des articles rédigés en :

    • RSS fr

    Alors le site étant franco-français, c’est bon de ce coté là, mais mes 18 mots clefs je ne les voit pas du tout...

    Une piste pour résoudre ce mystère ? J’ai loupé une marche en installant ?

    Merci d’avance de vos réponses :o)

    • Stampy88

      Bonjour, Je viens de faire la même chose, et lorsque je vais dans « Suivre la vie du site », dans le bloc « Syndicalisation par mots clé » je n’ai que ce texte :

      « Vous pouvez aussi limiter la syndication aux thèmes qui vous intéressent : »

      sans aucun mot clé en dessous.
      Je suis sur la version 1.9.2d

      Quelqu’un pourrait-il m’aider ? ce sont mes tout début avec SPIP :)

    Répondre à ce message

  • 1
    archi02

    Bonjour,

    Je ne suis pas encore très calé en spip, d’où ma question.

    Comment puis-je faire si je veux modifier le titre des flux des rubriques ou des mots clé ?
    Par exemple pour faire en sorte que le titre du flux indique : le nom du site comme actuellement, mais suivi du nom de la rubrique ou du mot-clé en question.

    Merci !

    • Aucune idée :-)
      J’ai très peu de temps à consacrer à Spip en ce moment, mais dès que possible, je jette un oeil là-dessus.

    Répondre à ce message

  • A mon humble point de vue la modification du fichier ’backend.html’ de la distribution ne se justifie pas pour faire fonctionner la syndication par mot_clef. La présence du filtre id_mot ? fait l’affaire, et le trrait du filtre branche ? ne fait que d’enlever la possibilité de syndiquer aussi une rubrique et ses sous rubriques au cas ou un utilisateur le souhaiterait.

    En d’autres mots : http://le_site_poussin.net/spip.php?page=backend&motxxx et http://le_site_poussin.net/spip.php?page=backend&rubriquexxx doivent fonctinner d’origine tous les deux ... Alors, restons simples ;-)

    Répondre à ce message

  • wattazoum

    hello,

    Il est magnifique ton plugin. Figure toi que j’ai failli, changer de système de publication à cause du manque d’un système de syndication par rubrique et par mot clé . Mais là tu me sauves .

    Merci beaucoup.

    PS : A mon humble avis , tu devrais intégrer ton hack dans le plugin par défaut. Ce n’est qu’un + .
    PSS : ce serait bien de rendre la liste des rubriques récursives . de sorte à ce que l’on puisse syndiquer les sous rubriques aussi .

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom