Les liens automatiques

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Cette contribution vous permettra de définir une série de mots qui se transformeront automatiquement en liens sur toutes les pages de votre site et ce via l’espace d’administration.

Cela peut s’avérer fort utile pour monter facilement un glossaire ou proposer à l’instar des actualités de Yahoo, certains liens relatifs (vers des images, rubriques ou fiches disponibles ailleurs sur le site, par exemple).

Mise en place

Installation de la table mysql

A l’aide de phpmyadmin par exemple, créez la table suivante sur votre base SPIP :

CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9hdXRvbGlua3M8L2NvZGU+"></span> (
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWQ8L2NvZGU+"></span> int(11) NOT NULL auto_increment,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bW90PC9jb2RlPg=="></span> varchar(50) NOT NULL default '',
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dXJsPC9jb2RlPg=="></span> varchar(255) NOT NULL default '',
  KEY <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWQ8L2NvZGU+"></span> (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWQ8L2NvZGU+"></span>)
) TYPE=MyISAM AUTO_INCREMENT=0 ;

Interface d’administration

Créez le fichier autolinks.php3 avec le code suivant ou téléchargez le ici :

<?php

//GPL LINAGORA SSLL 2004

include ("inc.php3");
debut_page("Liens automatiques", "documents", "autolinks");
echo "<br><br><br>";
gros_titre("Les liens automatiques");

debut_gauche();

echo "<FONT SIZE=2 FACE='Georgia,Garamond,Times,serif'>";

if ($connect_statut != "0minirezo" OR !$connect_toutes_rubriques) {
	echo "<B>Vous n'avez pas acc&egrave;s &agrave; cette page.</B>";
	exit;
}

$a = $_POST['a'];
if($a){
	if($a == "manage_post"){
		$delete = $_POST['delete'];
		if($delete){
			$msg = $_POST['msg'];
				foreach ($msg as $id => $val) {
					spip_query("DELETE FROM spip_autolinks WHERE id='$id'"); 
				}
		}
	}
	if($a == "new"){
		$mot = $_POST['mot'];
		if($mot){
			$mot = addslashes($mot);
			$url = addslashes($url);
				spip_query("INSERT into spip_autolinks VALUES('',  '$mot', '$url')");
		}
	}	
}

echo '<b>Nouveau lien automatique</b><br><br>'
.'<table cellpading="3" cellspacing="1">'
.'<form method="post" action="autolinks.php3">'
.'<tr><td>Mot: <input type="text" name="mot" size="50" maxlength="50"></td></tr>'
.'<tr><td>URL: <input type="text" name="url" size="50" maxlength="255"></td></tr>'
.'<td><input type="submit" value="Poster"></td></tr><input type="hidden" name="a" value="new"></form></table>';
echo '<br><br><b>Liens actifs</b><br><br>'
.'<table width="500" cellpading="3" cellspacing="1">'
.'<form method="post" action="autolinks.php3">';
$result = spip_query("SELECT id, mot, url FROM spip_autolinks order by id DESC");
while(list($id, $mot, $url) = spip_fetch_row($result)){
	$mot = stripslashes(htmlentities($mot));
	$url = stripslashes(htmlentities($url));
	echo "<tr><td><input type=\"checkbox\" name=\"msg[$id]\"></td><td>$mot => $url</td></tr>";
}
echo '<tr><td></td><td><input type="hidden" name="a" value="manage_post"><input type="submit" name="delete" value="Effacer la selection"></td>';
echo '</form></tr></table>';
echo "</FONT>";
fin_page();

?>

Puis placez-le dans votre répertoire ecrire/

Edition du fichier mes_fonctions.php3

Ajoutez dans votre fichier mes_fonctions.php3, présent à la racine de votre site, la fonction PHP suivante :

function autolinks ($texte) {
	$result = spip_query("select mot, url FROM spip_autolinks order by id");
	while (list($word, $val) = spip_fetch_row($result)) { 
		$mot[] = " $word ";
		$recherche[] = " <a href=\"$val\" class=\"spip_auto\">$word</a> ";
	}
	$texte = str_replace ($mot, $recherche, $texte);
	return $texte;
}

Définition des liens automatiques

Connectez-vous à votre espace d’administration, puis accédez à la page d’administration en vous rendant sur le fichier http://www.votresite.tld/ecrire/autolinks.php3

Renseignez le formulaire en indiquant le mot à recherché et l’url correspondante.

Le nombre de liens est illimités. Vous pouvez mettre des liens relatifs ou absolus. A noter egalement que les mots recherchés sont sensibles à la casse et doivent être isolés d’un espace de chaque coté.

Vous pouvez mettre très facilement un raccourci dans votre barre de navigation vers cette page d’administration, en suivant notre astuce présente sur cette page.

Edition de vos squelettes

Enfin, éditez vos squelettes en spécifiant pour chaque élément affichés s’ils doivent être traités ou non.

Exemple :

- [(#DESCRIPTIF|autolinks)]
- [(#TEXTE|autolinks)]
- [(#PS|autolinks)]

Discussion

16 discussions

  • bonjour

    glossaire interne fait un lien vers le mot clé.
    J’aimerais spécifier un autre lien (lien vers un article interne ou externe).
    Est-il possible d’assigner une redirection virtuel au mot clé (à l’exemple de celle qui existe pour les articles ) ?

    merci

    Répondre à ce message

  • Je souhaiterais utiliser un plugin de ce style pour spip 3. A première vue, je n’ai rien trouvé. Existe t il quelque chose ?
    Merci.

    Répondre à ce message

  • Bonjour a tous,
    je cherche depuis long temps un adaptation de ce contrib pour les derniers version de SPIP...
    J’ai essayee plusier fois de codee moi meme le contrib pour l’adaptee mais.. rien.. :-( page blanche !! uhfff !!
    Je croit que ca doit etre pas trop dure mais j’arrive pas...

    Quelqun peut m’aider ?
    merci beacoup

    Répondre à ce message

  • 6

    Bonjour,

    j’aurais voulu avoir si cette contrib marchait sous 1.9 ou si qqu’un travaillait sur un plugin « autolinks ».

    Merci

    • Bonjour,

      Pour faire fonctionner cette contrib sous SPIP 1.9x, il est nécessaire de faire quelques « ajustements ».

      1/Renommer le fichier autolinks.php3 en autolinks.php (ça n’est pas obligatoire, mais vu que SPIP 1.9x n’utilise maintenant que des extensions en .php, c’est plus joli ;-)

      2/ Dans autolinks.php, remplacer la ligne

      include ("inc.php3");
      par
      include_once 'inc_version.php';

      3/ Toujours dans autolinks.php, supprimer la condition

      if ($connect_statut != "0minirezo" OR !$connect_toutes_rubriques) {
      	echo "<B>Vous n'avez pas acc&egrave;s &agrave; cette page.</B>";
      	exit;
      }

      Elle est sans doute importante pour une question de sécurité, surtout si vous souhaitez ajouter une icone/lien vers autolinks.php dans l’interface d’administration, mais je ne suis pas assez calé pour réécrire ça de manière à ce que ça soit compatible avec SPIP 1.9x

      3/ Encore dans autolinks.php, rajouter quelque part dans le fichier la fonction spip_fetch_row() qui a disparue depuis SPIP 1.7 (à noter que j’ai essayé de remplacer cette fonction par spip_fetch_array() mais ça ne fonctionne pas) :

      function spip_fetch_row($r) {
      	if ($r)
      		return mysql_fetch_row($r);
      }

      4/ Dans mes_fonctions.php, rajouter également la fonction spip_fetch_row ci dessus.

      Là ça devrait fonctionner, reste ce problème de sécurité qui n’est pas reglé et les imperfections du code. Pour les imperfections, une solution a été donnée dans ces forums (le 5 août 2005).


      Sinon, j’ai un petit problème concernant une expression que je souhaiterai passer par le filtre autolinks mais qui résiste à cause d’une apostrophe :) Par exemple : Terry O’Quinn . L’apostrophe après le « O » semble faire obstacle... Si quelqu’un à la solution, qu’il n’hesite pas, je sèche completement là...

      Merci ! :)

    • en fait, le problème ne viens pas de l’postrophe, le mot sur lequel je testait était entouré de parenthèses, le problème viens de là... Si vous voyez comment faire, merci d’avance ! :)

    • Je crois avoir trouvé la solution pour la sécurité sous SPIP 1.9.

      Au lieu de

      if ($connect_statut != « 0minirezo » OR !$connect_toutes_rubriques)

      je mets

      if($auteur_session[’statut’] !=’0minirezo’)

      et ça marche.

      Si quelqu’un peut vérifier...

    • Non, ça ne marche pas, j’ai un « Vous n’avez pas accès à cette page. » comme avec l’autre fonction...

      Par contre ,j’ai toujours mon problème qui est finallement bien dû à l’apostrophe dans le mot à « autolinker », si tu as une idée à ce sujet, n’hésite pas ;)

    • Au temps pour moi, les apostrophes étaient mal traduites avec le copier/coller, ça à l’air de marcher ^^ Merci !

    • De rien...

      Si quelqu’un avait une piste pour éviter de casser les liens déjà existants, en autorisant par exemple le lien automatique seulement si le mot correspondant ne se trouve pas dan s une balise , ce serait bien de la partager. J’ai très peu de notion de php, donc je ne sais pas si ça se fait...

      Il serait bien aussi de pouvoir faire un lien automatique pour un groupe de mots dont un des mits se trouve déjà dans la liste des mots. Un exemple pour mieux comprendre : pouvoir mettre « espérance de vie » et « vie » dans la liste des liens automatiques sans qu’espérance de vie ne soit cassé. Par exemple en ayant trouvé une solution pour le premier problème, on pourrait lancer par effectuer la transformation en liens pour les groupes de mots les plus grands, et ainsi, en arrivant à « vie », le groupe de mots « espérance de vie » ne serait pas cassé car il serait déjà un lien...

    Répondre à ce message

  • 1

    Excellente contrib, merci ! Bien sûr, il demeure certaines imperfections qui « dégagent » pas mal de mots (dès lors qu’ils ne sont pas entourés d’espaces). Personnellement, je me suis creusé la tête pour améliorer le filtre car je souhaitais, par exemple, qu’un mot en italique ou en gras pointe tout de même vers le glossaire. De même, un mot à l’intérieur d’un titre, mis en exposant ou entouré d’un signe de ponctuation peut également être pris en considération. Avec la méthode que j’ai réécrite, vos rédacteurs peuvent saisir dans l’espace privé plusieurs orthographes ou synonymes du même mot, séparées par une barre verticale (ex : voiture|voitures|bagnole|bagnoles). Si vous faites de même, pensez à allonger la longueur du champ « mot » dans la base de données (varchar(255) devrait faire l’affaire).

    Voici le filtre « autolinks » que j’ai réécrite :

    function autolinks ($texte) {
     $result = spip_query("select mot, url FROM spip_autolinks order by id");
     while (list($word, $val) = spip_fetch_row($result)) {
            //Espaces autour du mot afin de proscrire les sous-chaînes (ex : "vie" dans "revient").
    	//Cela évite également de perturber le fonctionnement d'un lien (ex : <a href="toto">mot</a>).
    	//Problème : si l'on affecte une définition au mot "toto" de la chaîne <a href="xxx">titi toto tata</a>,
    	//le lien sera tout de même perturbé car le mot "toto" est entouré d'espaces.
    	//La fonction est insensible à la casse (ex : "série" et "Série").
    	//De plus, synonymes et orthographes sont séparés par une barre verticale (ex : "show|série|séries").
    	//Les groupes de mots sont également acceptés (ex : "une grande série").
    
    	//Mot auquel est appliqué un style Spip (par exemple, italique) :
            $texte = eregi_replace("\"([^_in]*|[^_out]*)\">($word) ", "\"\\1\"><a href=\"$val\" class=\"spip_auto\">\\2</a> ", $texte);
            $texte = eregi_replace(" ($word)</([^a{1}])>", " <a href=\"$val\" class=\"spip_auto\">\\1</a></\\2>", $texte);
            $texte = eregi_replace("\"([^_in]*|[^_out]*)\">($word)</([^a{1}])>", "\"\\1\"><a href=\"$val\" class=\"spip_auto\">\\2</a></\\3>", $texte);
    
            //Mot en début ou en fin de titre :
    	$texte = eregi_replace("(<h[1-5]>)($word) ", "\\1<a href=\"$val\" class=\"spip_auto\">\\2</a> ", $texte);
    	$texte = eregi_replace(" ($word)(</h[1-5]>)", " <a href=\"$val\" class=\"spip_auto\">\\1</a>\\2", $texte);
    	$texte = eregi_replace("(<h[1-5]>)($word)(</h[1-5]>)", "\\1<a href=\"$val\" class=\"spip_auto\">\\2</a>\\3", $texte);
    
            //Mot mis en exposant :
    	$texte = eregi_replace("<sup>($word) ", "<sup><a href=\"$val\" class=\"spip_auto\">\\1</a> ", $texte);
    	$texte = eregi_replace(" ($word)</sup>", " <a href=\"$val\" class=\"spip_auto\">\\1</a></sup>", $texte);
    	$texte = eregi_replace("<sup>($word)</sup>", "<sup><a href=\"$val\" class=\"spip_auto\">\\1</a></sup>", $texte);
    
    	//Mot précédé ou suivi d'un signe de ponctuation :
    	$texte = eregi_replace("((«)&nbsp;)($word) ", "\\1<a href=\"$val\" class=\"spip_auto\">\\3</a> ", $texte);
    	$texte = eregi_replace("(((“)|[[(]))($word) ", "\\1<a href=\"$val\" class=\"spip_auto\">\\4</a> ", $texte);
    	$texte = eregi_replace(" ($word)((&nbsp;)?([].?!:;)]|(»)|(”)))", " <a href=\"$val\" class=\"spip_auto\">\\1</a>\\2", $texte);
    
    	//Mot entouré d'espaces (isolé) :
    	$texte = eregi_replace(" ($word) ", " <a href=\"$val\" class=\"spip_auto\">\\1</a> ", $texte);
     }
     return $texte;
    }

    D’après tous les tests que j’ai effectués, ça ne fonctionne pas trop mal mais je suis sûr qu’il reste plein de problèmes. Par exemple, si un mot entouré d’espaces se trouve à l’intérieur d’un lien et qu’on lui affecte une définition, le lien initial risque d’être cassé. Cependant, rien qu’en prenant en compte les signes de ponctuation, on applique le glossaire à un grand nombre de mots en plus.

    Attention toutefois, le filtre que j’ai réécrit est bien sûr beaucoup plus gourmand en mémoire, mais je ne pense pas que cela pose de problème au vu des vitesses d’exécution PHP.

    Répondre à ce message

  • 1

    Pourquoi j’ai ceci qui apparait lors de la dernière étape ? (allez sur l,administration par autolinks.php3)

    Je suis sur 1.8.7

    merci bien !

    • Par « ceci » j’entendais bien sûr... Cela :

      Warning : Cannot modify header information - headers already sent by (output started at c :\program files\easyphp1-8\www\agecr.org\ecrire\autolinks.php3:10) in c :\program files\easyphp1-8\www\agecr.org\ecrire\inc_version.php3 on line 1097

      Warning : Cannot modify header information - headers already sent by (output started at c :\program files\easyphp1-8\www\agecr.org\ecrire\autolinks.php3:10) in c :\program files\easyphp1-8\www\agecr.org\ecrire\inc_version.php3 on line 1097

      Warning : Cannot modify header information - headers already sent by (output started at c :\program files\easyphp1-8\www\agecr.org\ecrire\autolinks.php3:10) in c :\program files\easyphp1-8\www\agecr.org\ecrire\inc_version.php3 on line 1097

      Warning : Cannot modify header information - headers already sent by (output started at c :\program files\easyphp1-8\www\agecr.org\ecrire\autolinks.php3:10) in c :\program files\easyphp1-8\www\agecr.org\ecrire\inc_version.php3 on line 1097

      Warning : Cannot modify header information - headers already sent by (output started at c :\program files\easyphp1-8\www\agecr.org\ecrire\autolinks.php3:10) in c :\program files\easyphp1-8\www\agecr.org\ecrire\inc_version.php3 on line 1097

    Répondre à ce message

  • 1
    LordEihwaz

    L’un d’entre vous aurait-il une idée pour comment aller chercher par exemple le titre de l’article cible des autoliens pour l’afficher dans la balise TITLE du lien A HREF ?

    Spip est génial, mais pas toujours pratique pour l’optimisation du référencement et du positionnement :)

    • Bonjour

      je suis très très intéressée par cette fonction, car j’en aurais bien besoin sur le site que je suis en train de créer. C’est un site à vocation musicale, consacré au groupe radiohead. Dans de nombreux articles, je parle de titres de chansons, et j’aimerais donc que quand un titre soit écrit quelque part un lien vers l’article traitant de cette chanson (par exemple) se crée automatiquement.

      J’ai installé et expérimenté toutes les solutions proposées ici, sans succès. je suis sous SPIP 1.8.3. (squette sandnyko modifié).

      Peut-on aussi créer ses liens après coup (car les articles sont déjà plus ou moins tous créés) ?

    Répondre à ce message

  • 3
    Philou1360

    Bonjour,
    Je viens de passer sous SPIP 1.8, et cela ne marche plus.
    J’ai l’erreur suivante :
    Fatal error : Call to undefined function : spip_fetch_row() in ......./ecrire/autolinks.php3 on line 50
    Que faire ?

    • Il faut réécrire un peu la contrib car spip_fetch_row() a été supprimée de SPIP 1.8, qui utilise désormais exclusivement spip_fetch_array().

    • Rq : une manière rapide de patcher la contrib est d’ajouter l’ancienne définition de spip_fetch_row() dans le code de la contrib ; tu le trouveras dans le fichier ecrire/inc_db_mysql.php3 de SPIP 1.7.2

    • Philou1360

      Merci beaucoup :-))

    Répondre à ce message

  • 1

    Magnifique ! Félicitations ! Très utile.
    En quelque sorte, ca remplace presque les mots clés...
    Je me demande si cette fonctionnalité fait travailler beaucoup plus spip ou pas.

    Encore merci !

    • Je me pose la même question : à quel moment la transformation en liens se passe ? Et si on a une grosse base de données de mots, est ce que ça ne va pas alourdir spip ?

    Répondre à ce message

  • Bonjour,

    En dépit d’une notice parfaitement claire, les mots « référents » n’apparaissent nulle part comme lien hypertexte. Il semble que je ne sois pas le seul dans ce cas. Faut-il que le mot choisi l’ait été avant que d’écrire les articles ou bien le script prend il en charge les articles déjà publiés ?

    Merci d’avance

    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