Yoan De Macedo [ Web & Minimalisme ]

Détecter la mise à jour d'un plugin WordPress

Si vous développez des modules WordPress, il est probable qu'entre deux versions d'un plugin, vous souhaitiez modifier la base ou réaliser un traitement particulier. WordPress ne dispose pas de mécanisme à ma connaissance permettant de détecter le changement de version d'un plugin. Il n'y a pas de hook pour ça.

Il est donc nécessaire de réaliser son propre système afin de résoudre ce problème.

Tout d'abord, il suffit de mettre en place une constante dans votre code définissant la version actuelle. De mon côté mes plugins sont des classes avec un squelette du type (je vous passe les headers de WP) :

    class MonPlugin(){

        /* Mes attributs */

        public function __construct(){
            register_activation_hook( __FILE__, array($this, 'install'));

            /* Je déclare ici les connexions aux autres hooks ... */

        }

        public function install(){
            /* Je réalise ici ce qui doit être fait à l'activation du module */
        }

        public function methode1(){

        }

        public function methode2(){

        }

        /* etc ... */
    }

Imaginons maintenant que dans ma version 1.0, je ne dispose pas d'une table dans la base de données dans mon plugin mais qu'une table soit nécessaire pour la 1.1. On ne pas utiliser la methode install() puisque qu'elle n'est appelée qu'à l'activation du plugin. Si l'utilisateur remplace le répertoire du plugin puis le désactive et le réactive à nouveau, c'est bon. Mais il ne fera peut-être que remplacer le répertoire. Dans ce cas, aucun traitement ne sera réalisé.

Nous allons utiliser le hook plugins_loaded qui est appelé au chargement du plugin. Nous réaliserons ici le traitement nécessaire pour vérifier la version et la mettre à jour si nécessaire. Il est donc indispensable d'avoir une constante dans le code pour stocker la version en cours (celle du plugin disponible sur le serveur) et la version connue par WorPress (stockée en base).

    class MonPlugin(){

        const PLUGIN_VERSION = '1.1.0';

        /* mes attributs */

        public function __construct(){
            register_activation_hook( __FILE__, array($this, 'install'));
            add_action('plugins_loaded', array($this, 'load_plugin'));  

            /* Je déclare ici les connexions aux autres hooks ... */

        }

        public function install(){
            /* Je réalise ici ce qui doit être fait à l'activation du module */
        }

        public function load_plugin(){

                if(self::PLUGIN_VERSION != get_option('monplugin_version')){
                    /* La version a changé */
                    /* On réalise les traitements nécessaires en fonction des versions ... */

                    update_option('monplugin_version', self::PLUGIN_VERSION);
                }
        }

        public function methode1(){

        }

        public function methode2(){

        }
        /* etc ... */
    }

Si la version en base n'est pas la même que la constante définie dans le code alors on réalise un traitement particulier puis on met à jour la version dans la base. Avec cette méthode, vous pourrez traiter les mises à jours de vos plugins lorsqu'ils ont besoin de traitement entre deux versions.

Si le mécanisme n'était pas présent dans la première version, ce n'est pas très grave puisque l'appel à get_option('monplugin_version') ne vous retournera rien. Vous pourrez alors fixer la version manuellement car le plugin est forcément antérieur à l'ajout du mécanisme.

De mon côté, j'ai poussé le système un peu plus loin en appliquant des patchs à la chaîne. En effet, il est possible qu'un traitement soit nécessaire entre la 1.0 et la 1.1 mais aussi entre la 1.1 et la 1.2 et la 1.2 et 1.3. Que faire si un utilisateur passe directement de la 1.1 à la 1.3 ? Il ne faut pas appliquer les changements de la 1.3 seulement mais tous les changements précédents. Je définis donc les changements entre 1.0 et 1.1, 1.1 et 1.2, 1.2 et 1.3 et j'applique tous les patchs nécessaires entre la version installée et la nouvelle.

(Posté le 09-02-2018)

Les articles du blog | Qui suis-je ? | Mes prestations | mail@yoandm.com

Je partage mes découvertes avec vous.
N'hésitez pas à vous abonner. Je déteste le SPAM, soyez tranquille.
Mentions légales | Propulsé par Grav