• 15 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Mis à jour le 13/03/2018

Modifier la base de données

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Exécuter des requêtes SQL

Pour aller plus loin, nous allons avoir besoin d’une table spécifique pour stocker les adresses email des abonnées à la newsletter. Cette table contiendra deux colonnes :

  • un champ id pour la clé primaire ;

  • un champ email pour stocker l’adresse des inscrits.

Créer une nouvelle table

Pour créer la table contenant les adresses email, nous devons exécuter une requête SQL spécifique. Dans WordPress, l’accès à la base de données se fait à l’aide de la classe wpdb, qui contient de nombreuses méthodes pour interagir avec elle. Notamment, une méthode query() est destinée à exécuter les requêtes qui lui sont passées en paramètre.

Une instance de la classe wpdb est créée au chargement de l’application et stockée dans une variable globale. Sa récupération se fait donc depuis n’importe quel endroit du code de façon très simple :

<?php
global $wpdb ;

Dans la classe Zero_Newsletter, créons une fonction statique install() qui aura pour charge d’effectuer toutes les actions nécessaires lors de l’activation du plugin. Pour l’instant, seul un appel à la méthode wpdb::query() est nécessaire.

<?php
public static function install()
{
    global $wpdb;

    $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}zero_newsletter_email (id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL);");
}

À quoi correspond la variable $wpdb->prefix dans la requête ?

Vous vous rappelez probablement que lors de l’installation, WordPress nous avait demandé de choisir un préfixe pour les tables de la base de données. L’attribut prefix de la classe wpdb contient la valeur de ce préfixe, qui peut être différent d’une installation de WordPress à l’autre. Par conséquent, nous devons l’utiliser pour déterminer le nom de la table que nous allons créer.

Il nous reste maintenant à appeler la méthode install() pour lancer la création de la table des adresses.

Tracer l’activation du plugin

Évidemment, la création de la table ne doit être effectuée qu’une seule fois, lorsque le plugin sera installé. Il nous faut donc un moyen de savoir que le plugin vient d’être installé, pour effectuer les modifications dans la base de donnée à cet instant uniquement.

Heureusement pour nous, WordPress déclenche des événements particuliers lorsqu’un plugin est activé, désactivé ou bien encore supprimé de l’application. C’est ici le premier cas qui nous intéresse mais les autres fonctionnent de façon similaire.

La fonction register_activation_hook(), définie dans wp-includes/plugin.php, permet d’ajouter une fonction à appeler lors de l’activation d’un plugin particulier.

Cette fonction doit être appelée dans le fichier principal du plugin (celui qui définit la valeur « Plugin Name » dans l’en-tête) et préciser le chemin du plugin ainsi que la fonction à exécuter à l’activation.

Pour passer le chemin du plugin, il suffit d’utiliser la constante __FILE__, indiquant le nom du fichier courant.

En interne, la fonction register_activation_hook() va transformer __FILE__ en une chaîne de la forme dossier_du_plugin/nom_du_plugin qui permet d’identifier le plugin de façon unique, dans notre cas zero/zero.

L’appel peut être placé directement dans le constructeur de la classe Zero_Plugin, il est finalement très similaire à ce que l’on avait pour l’ajout d’actions ou de filtres :

<?php
register_activation_hook(__FILE__, array('Zero_Newsletter', 'install'));

Si votre plugin est déjà activé, désactivez-le puis réactivez-le à nouveau afin de déclencher la création de la table dans la base de données. Pour vérifier sa bonne exécution, nous pouvons aller dans phpmyadmin et voir sur la côté gauche la liste des tables de la base de données (voir la figure suivante).

Résultat de la table des adresses email
Résultat de la table des adresses email

La désactivation et la désinstallation du plugin

En plus de l’activation, nous pouvons tracer la désactivation d’un plugin, ainsi que sa suppression pure et simple. Pour cela, il existe la fonction register_deactivation_hook(), dont l’appel est strictement identique à register_activation_hook(), mais vous n'en aurez pas l'utilité ici.

En revanche, nous devons penser à la désinstallation du plugin. En effet, si un utilisateur décide de supprimer le plugin de son installation WordPress, il faut aussi que la table que nous avons créée soit effacée de la base de données pour que celle-ci retrouve son état original.

De même que pour l’installation, créons une fonction qui va cette fois supprimer la table des adresses.

<?php
public static function uninstall()
{
    global $wpdb;

    $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}zero_newsletter_email;");
}

Il ne reste qu’à appeler la fonction register_uninstall_hook() à la fin du constructeur de Zero_Plugin.

<?php
register_uninstall_hook(__FILE__, array('Zero_Newsletter', 'uninstall'));

Maintenant, si vous supprimez le plugin à l’aide du lien « Supprimer » dans la page de gestion des plugins, la table des adresses sera elle aussi effacée.

L'insertion et la sélection

Il ne reste plus qu’une étape pour lier le widget et la base de données ; nous avons besoin d’enregistrer les adresses entrées par les visiteurs dans la table spécifiquement créée. Pour cela, il nous faut avant tout une méthode save_email() se chargeant de l’ajout des adresses à la base de données. Cette méthode de la classe Zero_Newsletter sera appelée sur toutes les pages du site et vérifiera la présence d’une variable zero_newsletter_email dans la superglobale $_POST. Si elle existe, la valeur contenue sera insérée dans la table dédiée.

Comme pour les requêtes précédentes, nous utilisons l’objet wpdb pour interagir avec la base de données. Avant d’effectuer l’insertion, nous devons vérifier si l’adresse proposée n’existe pas déjà dans la table, auquel cas nous arrêterions le processus. Nous utilisons pour cela la méthode wpdb::get_row(), prenant en paramètre la requête SQL à exécuter.

<?php
if (isset($_POST['zero_newsletter_email']) && !empty($_POST['zero_newsletter_email'])) {
        global $wpdb;
        $email = $_POST['zero_newsletter_email'];

        $row = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}zero_newsletter_email WHERE email = '$email'");

La méthode get_row() retourne un tableau des colonnes de la première ligne de résultats de la requête, ou bien la valeur null si aucun résultat n’est trouvé.

WordPress se charge de protéger toutes les requêtes contre les failles de sécurité lorsqu'elles sont soumises via la méthode query(), elle-même appelée par get_row(). Il n’est donc pas nécessaire de vous charger de nettoyer les variables présentes dans vos requêtes.

Si la requête ne retourne aucun résultat, nous pouvons insérer la nouvelle adresse en passant par la méthode insert(). Le premier paramètre de celle-ci est le nom de la table dans laquelle on souhaite insérer une ligne, le second est un tableau associatif contenant les valeurs de la ligne pour chaque champ de la table.

<?php
if (is_null($row)) {
    $wpdb->insert("{$wpdb->prefix}zero_newsletter_email", array('email' => $email));
}

C’est tout ! La méthode save_email() est prête à enregistrer toutes les adresses de vos visiteurs ! Voici un récapitulatif de son contenu :

<?php
public function save_email()
{
    if (isset($_POST['zero_newsletter_email']) && !empty($_POST['zero_newsletter_email'])) {
        global $wpdb;
        $email = $_POST['zero_newsletter_email'];

        $row = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}zero_newsletter_email WHERE email = '$email'");
        if (is_null($row)) {
            $wpdb->insert("{$wpdb->prefix}zero_newsletter_email", array('email' => $email));
        }
    }
}

Nous n’avons pas géré la vérification du format de l’adresse email car le but reste ici de montrer comment traiter la valeur reçue et l’insérer en base. Dans une application réelle, il faudrait bien entendu vérifier que la valeur envoyée correspond bien à une adresse email.

Il faut maintenant utiliser une action dans le constructeur de la classe Zero_Newsletter pour connecter la méthode save_email() à l’affichage des pages du site. Pour cela, nous pouvons utiliser l’identifiant wp_loaded qui correspond à l’instant où l’application est chargée et où elle s’apprête à effectuer le rendu du thème pour la page demandée.

<?php
add_action('wp_loaded', array($this, 'save_email'));

En entrant une adresse email puis en validant le formulaire, nous restons sur la même page mais la table des adresses doit contenir l’adresse choisie (voir la figure suivante).

Enregistrement des adresses dans la table
Enregistrement des adresses dans la table
  • Les requêtes SQL sont traitées par l'objet wpdb.

  • L'API (Interface de programmation) fournit des méthodes pour créer facilement des requêtes de sélection, d'insertion et de mise à jour des entrées d'une table.

Exemple de certificat de réussite
Exemple de certificat de réussite