Ajout de références à WordPress

Hop, premier papier dans la catégorie geekage informatique. D’une manière générale les articles postés ici seront surtout des mémos des différents bricolages que j’effectue, ça me permettra d’en garder une trace et donc de ne pas tout perdre dès que je fais une mise-à-jour 🙄

Premier truc donc, ajouter un système de gestion de référence à WordPress. En d’autre terme, faire en sorte que si vous placez dans votre article : Ceci est un texte <ref>et ceci une référence.</ref>

Vous obteniez : Ceci est un texte [1]

Et à la fin de l’article une boite listant toutes les références données.

J’avais initialement bricolé un petit truc perso en 3 ou 4 lignes de Php, mais c’était pas génial car implanté comme un porc dans le code même de WordPress, donc à chaque mise-à-jour il fallait l’insérer de nouveau. De plus il y a (au moins) un plugin qui fait en gros cela, mais il se base directement sur des liens, donc pas exactement ce que je veux. C’est le plugin List of references, et c’est par ici pour le télécharger : http://wordpress.org/extend/plugins/auto-list-of-references/. Comme il ne fait pas exactement ce que je veux, à savoir gérer des tags spécifiques et compter dynamiquement mes références, je l’ai adapté à mes besoins. Le code est assez compréhensible je crois, et j’ai pas mal commenté :

/**
   * Plugin Name: List of references reload
   * Plugin URI: http://wordpress.org/extend/plugins/auto-list-of-references/
   * Description: Personnal adaptation of &quot;List of references&quot; plugin by Christian Weichel (http://32leaves.net)
   * Version: 1.1
   * Author: Charlie Merland
   * Author URI: http://32leaves.net/
   */

// basic format for our ref links
$FORMAT = &quot;&lt;small&gt;[&lt;a id={id}&gt;{uid}&lt;/a&gt;]&lt;/small&gt; {content}&quot;;

class ListOfReferencesGenerator {
	private $_id;
	private $_text;
	
	public function __construct($text) {
		$this-&gt;_id = rand();
		$this-&gt;_text = $text;
		$this-&gt;_text = $this-&gt;setOldRef($text);
	}

	/**
	 * Deal with older manual references
	 * @param string $text the post content
	 * @return string the text where all :int: and [int] have been replaced by anchors and links
	 */
	private function setOldRef($text) {
		// remplacement
		$text = preg_replace(&quot;((:)(d+)(:))&quot;, &quot;&lt;small&gt;[&lt;a id=&quot;&quot;.$this-&gt;_id.&quot;$2&quot;&gt;$2&lt;/a&gt;]&lt;/small&gt;&quot;, $text);
		$text = preg_replace(&quot;(([)(d+)(]))&quot;, &quot;&lt;small&gt;[&lt;a href=&quot;#&quot;.$this-&gt;_id.&quot;$2&quot;&gt;$2&lt;/a&gt;]&lt;/small&gt;&quot;, $text);
		// return
		return $text;
	}

	/**
	 * Search for every reference in the text
	 * @return array all references found
	 */
	private function parseReferences() {
		// &lt;ref&gt;this is a reference&lt;/ref&gt;
		preg_match_all(&quot;#&lt;ref&gt;s*(.*?)&lt;/ref&gt;#i&quot;, $this-&gt;_text, $matches);
		return $matches;
	}

	/**
	 * Create the list that will be displayed
	 * @return string the references list
	 */
	private function prepareReferencesList() {
		// how to present our references
		global $FORMAT;
		// list to store those references
		$list = array();
		// parsing those refs
		$parsed_refs = $this-&gt;parseReferences();
		// init id
		$id = 0;
		// for each ref
		for($i = 0; $i &lt; count($parsed_refs[0]); $i += 1) {
			$id += 1;
			// strip &quot; &quot;
			$text = str_replace('&quot;', '', $parsed_refs[1][$i]);
			// every reference has a text and an ID
			$list[$text] = array($text, $id);
		}
		$this-&gt;list = $list;
		
		$result = &quot;&lt;fieldset class=&quot;ref&quot;&gt;&lt;legend&gt;R&amp;amp;eacute;f&amp;amp;eacute;rences :&lt;/legend&gt;&quot;;
		// for each ref of the list
		foreach($list as $ref =&gt; $content) {
			// get text
			$text = $content[0];
			// get ID
			$id = &quot;&quot;.$this-&gt;_id.&quot;&quot;.$content[1];
			// get ID to show
			$uid = $content[1];
			// replace each tag
			$result .= str_replace(&quot;{id}&quot;, $id, str_replace(&quot;{uid}&quot;, $uid, str_replace(&quot;{content}&quot;, $text, $FORMAT)));
		}
		$result .= &quot;&lt;/fieldset&gt;&quot;;
		
		return $result;
	}

	/**
	 * Replace every reference declaration with a simple link
	 * @return string the link
	 */
	public function replace_link_callback($matches) {
		// strip &quot; &quot;
		$id = $this-&gt;list[str_replace('&quot;', '', $matches[1])];
		// return a simple link to the anchor
		return $result = &quot;&lt;small&gt;[&lt;a href=&quot;#$tid$id[1]&quot;&gt;$id[1]&lt;/a&gt;]&lt;/small&gt;&quot;;
	}

	/**
	 * Replace every reference declaration with a simple link
	 * @return string the link
	 */
	public function process() {
		// checking ref presence
		if(!$this-&gt;isEnabled()) return $this-&gt;_text;

		// prepare the list
		$list = $this-&gt;prepareReferencesList();
		// this must be useful
		$result = preg_replace_callback(&quot;#&lt;ref&gt;s*(.*?)&lt;/ref&gt;#i&quot;, array(&amp;amp;$this, 'replace_link_callback'), $this-&gt;_text);
		// add the references list
		$result = str_replace(&quot;&lt;references /&gt;&quot;, $list, $result);
		// return
		return $result;
	}
	
	/**
	 * Check for a &lt;references /&gt; tag indicating we actually have references
	 * @return boolean any ref or not?
	 */
	private function isEnabled() {
		return strpos($this-&gt;_text, '&lt;references /&gt;') !== false;
	}
	
}

function filter_list_of_references($text) {
	$processor = new ListOfReferencesGenerator($text);
	return $processor-&gt;process();
}

add_filter('the_content', 'filter_list_of_references');

Ainsi il vous suffit de mettre toutes vos références de la forme <ref>ma référence</ref>, ajouter un <references /> à la fin de votre article, et toutes les références y seront listées, numérotées et liées. Ça n’a l’air de rien, mais c’est quand même bien pratique…

Publié par Charlie

Être humain depuis 1986, développeur web, designer et photographe, je code pour le Web depuis 2000 et pour WordPress depuis 2008. Aventure, Histoire, sciences, musique, café ou personnages forts en caractère et dotés d'un nez en tout point remarquable sont parmi mes passions les plus dévorantes. Indépendant depuis 2010 je travaille avec des gens formidables dans le monde entier, de la Californie à l'Europe en passant par l'Australie et l'Asie. D'autres détails croustillants ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

*