Utiliser les sessions avec WordPress

Je me suis aperçu en développant un nouveau plugin que WordPress ne supportait pas les sessions par défaut. Une vérification dans le code source du système le confirme. WordPress utilise un cookie pour gérer son propre système de sessions.
Pour faire marcher les sessions dans un plugin, il suffit de  d’ajouter session_start()
Le problème est « où l’ajouter » ?Une recherche sur Google conduit à  quelques sites anglophones, qui proposent chacun une endroit différent pour placer le session_start() :

  • au début du fichier index.php : pas très satisfaisant, ce fichier risque d’être écrasé lors de la prochaine mise à  jour de WordPress
  • dans le fichier wp-config.php : pourquoi pas; cet endroit ne sera pas affecté par une mise à  jour de WordPress

Mon idée initiale était de ne toucher sous aucun prétexte au code source de WordPress, car ce genre d’intervention est impossible à  maintenir sur le long terme (risque de fichiers écrasés lors des mises à  jour, plugin non portable sur un autre site sans effectuer la même modification, etc…).

Je me suis donc mis à  décortiquer le code source de certains plugins, qui visiblement utilisaient les sessions, et notamment le plugin WP-Commerce (qui permet de gérer une boutique en ligne avec un panier d’achat). Ce plugin utilise la solution que je décris ci-dessous :

La solution

L’idée est d’appeler la fonction session_start() avant tout affichage, et avant les traitements du plugin qui risque d’avoir accès au variables stockées dans la session.

Le crochet WordPress (hook) idéal semble être ‘template_redirect’.

Ce crochet est situé juste après l’initialisation de chaque page, quand les différents paramètres de l’URL sont analysés, mais avant l’appel au template, donc avant tout affichage.

Voici donc le code à  ajouter à  votre plugin pour activer les sessions :

add_action('template_redirect', 'votre_plugin_init', 0);

function votre_plugin_init () {

	$session_id = session_id();

	if(empty($session_id)) 

	{

  		session_start();

	}
// after init and after when the wp query string is parsed but before anything is displayed
add_action(‘template_redirect’, ‘service_smtp_init’, 0);

}