Lorsque l’on crée un plugin pour WordPress, on peut avoir besoin de stocker des informations et de simples options dans la table wp_options
, même sous forme de tableau sérialisés ne suffisent plus.
Création de la table
WordPress dispose d’un objet global $wpdb
qui dispose de méthodes et de propriétés pour agir sur la base de données. Chaque table de la base de données est préfixée par une chaîne donnée par la propriété $wpdb->prefix
. La collation utilisée est donnée par la méthode $wpdb->get_charset_collate()
.
Je veux créer une table pour stocker le contenu des fichiers joints pdf
afin de les inclure dans des requêtes de recherche. J’ai donc besoin de :
ID
du post :bigint
,post_parent
:bigint
,post_name
:varchar(200)
,post_date
:datetime
,post_author
:bigint
,post_title
:text
,post_mime_type
:varchar(20)
, si je décide d’y mettre autre chose tel que lesdocx
,pptx
, …post_content
:longtext
.
La requête sq
l de création de la table est :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE TABLE `myBase`.`myTable` ( `ID` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `post_parent` BIGINT UNSIGNED NOT NULL DEFAULT '0', `post_name` VARCHAR(200) NOT NULL DEFAULT '', `post_date` DATETIME NULL, `post_author` BIGINT UNSIGNED NOT NULL DEFAULT '0', `post_title` TEXT NOT NULL, `post_mime_type` VARCHAR(200) NOT NULL DEFAULT '', `post_content` LONGTEXT NOT NULL, PRIMARY KEY (`ID`) ) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE utf8mb4_general_ci; |
Dans WordPress, on utilise la fonction dbDelta()
définie dans le fichier wp-admin/includes/upgrade.php
, plutôt que de soumettre directement la requête sql
de création. La fonction dbDelta()
examine la structure de table actuelle si elle existe, la compare à la structure de table souhaitée et ajoute ou modifie la table si nécessaire, elle est donc très pratique pour les mises à jour. Néanmoins, il y a certains points à respecter :
- On doit mettre chaque champ sur une ligne,
- Il doit y avoir 2 espaces entre
PRIMARY KEY
et la définition de cette clé, - On doit utiliser le mot clé
KEY
au lieu de son synonymeINDEX
et l’on doit inclure au moins une cléKEY
, - On ne doit pas utiliser d’apostrophes quotes ou d’accents graves backticks autour les noms des champs (colonnes),
- Les mots clés
sql
doivent être en majuscules, - Chaque champ doit comporter une longueur pour ceux qui en acceptent (
INT
,VARCHAR
), - Les types des champs doivent être en minuscules.
On écrit donc les instructions à insérer dans une fonction :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
global $wpdb; $table_name = $wpdb->prefix . 'myTable'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( ID bigint unsigned NOT NULL AUTO_INCREMENT, post_parent bigint unsigned NOT NULL DEFAULT '0', post_name varchar(200) NOT NULL DEFAULT '', post_date datetime NULL, post_author bigint unsigned NOT NULL DEFAULT '0', post_title text NOT NULL, post_mime_type varchar(200) NOT NULL DEFAULT '', post_content longtext NOT NULL, PRIMARY KEY (ID) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); |
Si la table n’existe pas, la fonction dbDelta()
renvoie un tableau avec une clé dont le nom est le nom de la table table_name et la valeur la chaîne Created table table_name. Si la table existe déjà, et si aucun champ ne change, la fonction renvoie un tableau vide. Si le type d’un champ change, le tableau contiendra les champs dont le type a changé avec la chaîne Changed type of table_name.field from old_type to new_type. Si on ajoute un champ , chaque champ ajouté avec la chaîne Added column table_name.field. Si l’on met moins de champ et que l’on relance la fonction, les anciens champs restent, et le retour est un tableau vide. Pour supprimer un champ, on utilise une requête mysql ATER TABLE
.
1 |
$wpdb->query( "ATER TABLE $table_name DROP COLUMN $field" ); |
Suppression du plugin et de la table
La table devra être effacée si l’extension est supprimée par l’utilisateur. On peut écrire un fichier uninstall.php
qui sera appelé lorsque le plugin est supprimé. Cet article résume la procédure à effectuer. Il faudra écrire une requête DROP TABLE
que l’on appellera avec l’objet $wpdb
et la méthode query
.
Et hop, on peut créer des tables pour stocker les informations nécessaires à une extension.