Manipuler la base de données avec un plugin Wordpress
Maintenant que nous savons créer des panneaux d'administration et des panneaux utilisateurs, nous allons attaquer l'accès au model : en interagissant avec la base de données. C'est une partie très importante du tutoriel wordpress, car lorsque l'on écrit un plugin, on a dans la majorité des cas besoin de stocker des données dans une base.
Heureusement pour nous, le système Wordpress rend l'accès aux données très simple : c'est l'objet de cet article.
Stocker des données dans une base de données Wordpress
Il y a 2 manières de procéder pour communiquer avec la base de données wordpress :
- en créant notre propre table
- en utilisant les options
Certains plugins n'ont pas besoin de leur propre base de données : on peut alors se contenter d'utiliser les options et les 4 méthodes fournies par wordpress pour communiquer avec les options, nous les avons déjà utilisés dans le tutoriel "création du panneau d'administration" et le tutoriel "création du panneau utilisateur" en appelant les fonctions :
- add_option() : pour ajouter une option, cette fonction accepte 4 arguments : $name, $value, $description et $autoload, vous trouverez sa description ici : http://codex.wordpress.org/Function_Reference/add_option
- get_option() : pour rechercher une valeur : http://codex.wordpress.org/Function_Reference/get_option
- update_option() : http://codex.wordpress.org/Function_Reference/update_option
- delete_option() : http://codex.wordpress.org/Function_Reference/delete_option
C'est très pratique pour stocker des paramètres de configuration, cependant, l'intérêt se limite de mon point de vue à cela. Dans le cas de notre plugin exemple wp_jschat, nous avons besoin de stocker les messages envoyés par les utilisateurs dans une table particulière, avec une structure précise.
Création de table pour l'installation du plugin
Lors de l'installation de notre plugin, nous devons prévoir la création de nouvelles tables dans notre base de données. Nous appellerons ces table jschat_messages (pour stocker les messages) et jschat_canal (pour stocker les canaux). Afin de respecter le nommage des tables wordpress, nous ajouterons le préfixe présent sur toutes les tables de notre blog wordpress.
L'objet $wpdb
L'objet $wpdb est celui qui sert à accéder aux données. Il permet entre autre d'effectuer des requêtes, d'en récupérer le résultat et dans le cas présent, de connaître le préfixe utilisé pour les tables.
Création de la fonction d'installation
Nous allons créer une fonction qui va initialiser notre plugin : créer la table, et inscrire le numéro de version dans le registre wordpress en utilisant les options :
/**
* Installation du plugin wp_jschat
* @global wpdb $wpdb
*/
function wp_jschat_install()
{
global $wpdb;
$table_name = $wpdb->prefix.'jschat_messages';
$table_canal_name = $wpdb->prefix.'jschat_canal';
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name)
{
//création de la table
$sql = "CREATE TABLE `$table_name` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`id_user` BIGINT UNSIGNED NOT NULL ,
`pseudo` VARCHAR( 30 ) NOT NULL ,
`message` VARCHAR( 255 ) NOT NULL ,
`canal` VARCHAR( 255 ) NOT NULL ,
`created_at` DATETIME NOT NULL ,
`ip` VARCHAR( 20 ) NOT NULL
) ;";
$sql .= "CREATE TABLE `$table_canal_name` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 255 ) NOT NULL,
`created_at` DATETIME NOT NULL
) ;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
//ajout d'une ligne de message
$initialMessage = __('Bienvenue sur le chat');
$initialPseudo = __('Système');
$wpdb->insert($table_name, array(
'id_user' => 0,
'pseudo' => $initialPseudo,
'message' => $initialMessage,
'created_at' => current_time('mysql') //attention au type de db
));
//ajout du canal par défaut 'widget'
$wpdb->insert($table_canal_name, array(
'name' => 'widget',
'title' => __("Voici le canal de discussion par défaut widget"),
'description' => '',
'created_at' => current_time('mysql') //attention au type de db
));
$option['wp_jschat_version'] = $this->version;
}
add_option('wp_jschat_version',$option);
}
Cette fonction crée les nouvelles tables dans notre base de données Wordpress, et ajoute une ligne de bienvenue pour initialiser le chat (effectue une insertion dans la base). Notez que le commentaire "@global wpdb $wpdb" en en-tête de fonction permet d'obtenir la complétion sur l'objet Wordpress d'interaction avec la base de données dans votre IDE de développement.
A la fin de la fonction, on ajoute au registre de Wordpress le numéro de version de notre plugin en utilisant les options dont nous avons parlé précédemment.
Appel de la fonction d'installation
Maintenant que notre fonction est créée, il faut dire à Wordpress de l'appeler lors de l'installation du plugin dans l'administration, c'est faisable grâce à la fonction register_activation_hook() fournie par wordpress :
register_activation_hook(__FILE__, array(&$inst_wp_jschat, 'wp_jschat_install'));
Désinstallation du plugin
De la même manière que nous avons crée un fonction d'installation, nous devons créer une fonction de désinstallation. De nombreux plugins Wordpress ne comporte pas de telles fonctions ce qui entraîne la présence de table qui ne servent à rien dans la base de données wordpress.
En clair, il faut nettoyer les données que nous avons ajouté :
- la table jschat_messages,
- toutes les options (utilisateur, admin et version).
/**
* Désinstallation du plugin wp_jschat
* @global wpdb $wpdb
*/
function wp_jschat_uninstall()
{
global $wpdb;
$table_name = $wpdb->prefix.'jschat_messages';
$table_canal_name = $wpdb->prefix.'jschat_canal';
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name)
{
//création de la table
$sql = "DROP TABLE `$table_name`";
$wpdb->query($sql);
$sql = "DROP TABLE `$table_canal_name`";
$wpdb->query($sql);
}
delete_option('wp_jschat_version');
delete_option($this->adminOptionsName);
delete_option($this->userOptionsName);
}
Cette fonction supprime tout ce qui concerne notre plugin dans la base de données.
Appel de la fonction de désinstallation
De la même manière, il faut prévenir le système wordpress d'appeler cette fonction lors de la désinstallation de notre plugin, en utilisant la fonction register_deactivation_hook() :
register_deactivation_hook(__FILE__, array(&$inst_wp_jschat, 'wp_jschat_uninstall'));
En agissant ainsi, vous préservez les utilisateurs de votre plugin du stockage de données inutiles, et faites un geste pour l'environnement ;-)













C'est exactement ce que je cherchais ;)