web-dev-qa-db-fra.com

Comment mettre à jour une table existante lors de la mise à jour du plugin?

J'ai ajouté un nouveau champ (time_last_seen) dans mon tableau de plug-in (v1.1), puis j'ai téléchargé mon plug-in en tant que version 1.2 dans le référentiel wordpress svn. Lorsque je mets à jour mon plugin à partir du panneau d'administration, cela ne crée pas le champ (time_last_seen) dans la table.

Voici ce que j'ai essayé:

function ulh_add_user_logins_table() {
    global $wpdb;
        $oldVersion = get_option( 'fa_userloginhostory_version', '1.0' );
        $newVersion = '1.2';

    $charset_collate = $wpdb->get_charset_collate();
        $fa_user_logins_table = $wpdb->prefix . "fa_user_logins";

    $sql = "CREATE TABLE $fa_user_logins_table (
         id int(11) NOT NULL AUTO_INCREMENT,
   user_id int(11) ,
  `time_login` datetime NOT NULL,
  `time_logout` datetime NOT NULL,
   `time_last_seen` datetime NOT NULL, 
  `ip_address` varchar(20) NOT NULL,
  `browser` varchar(100) NOT NULL,
  `operating_system` varchar(100) NOT NULL,
  `country_name` varchar(100) NOT NULL,
  `country_code` varchar(20) NOT NULL   ,                             
   PRIMARY KEY (`id`)
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
    update_option( 'fa_userloginhostory_version', $newVersion );
}

register_activation_hook(__FILE__, 'ulh_add_user_logins_table');
1
Faiyaz Alam

register_activation_hook() attache uniquement une fonction à exécuter sur l'activation de votre plugin, pas sur la mise à jour. Voir la documentation pour tous les détails, en particulier cette partie:

3.1: Ce hook est maintenant activé uniquement lorsque l'utilisateur active le plug-in et non lorsqu'une mise à jour automatique du plug-in a lieu (n ° 14915).

Bien sûr, vous pouvez forcer votre hook à s'exécuter en désactivant et en réactivant votre plugin, mais vous ne voulez certainement pas que vos utilisateurs soient obligés de le faire :)

Un meilleur moyen serait de gérer la "version de la base de données" de votre plugin - donc, stockez peut-être le numéro de la "version actuelle" de votre plugin dans la base de données. Lorsque votre plugin est exécuté, vérifiez ce numéro de version par rapport à la version réelle de votre plugin. Si c'est différent ... c'est quand vous voulez ajouter ce champ à la base de données.

Bien sûr, pour les toutes nouvelles installations de la v1.1 de votre plugin, vous voulez toujours le lancer tel que vous êtes actuellement. Il vous suffit de prendre également en compte le chemin de mise à niveau que prendront les utilisateurs existants - tels que vous-même dans cet exemple -.

Lectures supplémentaires que je recommanderais certainement pour ce sujet:

2
Tim Malone

selon la réponse donnée par Tim Malone, j'ai ce code de travail:

 /* Activate Hook Plugin */
    register_activation_hook(__FILE__, 'ulh_add_user_logins_table');

    /* call when plugin is activated */
    function ulh_add_user_logins_table() {
        global $wpdb;
        $charset_collate = $wpdb->get_charset_collate();
            $fa_user_logins_table = $wpdb->prefix . "fa_user_logins";

        $sql = "CREATE TABLE $fa_user_logins_table (
             id int(11) NOT NULL AUTO_INCREMENT,
       user_id int(11) ,
      `time_login` datetime NOT NULL,
      `time_logout` datetime NOT NULL,
      `ip_address` varchar(20) NOT NULL,
      `browser` varchar(100) NOT NULL,
      `operating_system` varchar(100) NOT NULL,
      `country_name` varchar(100) NOT NULL,
      `country_code` varchar(20) NOT NULL   ,                             
       PRIMARY KEY (`id`)
        ) $charset_collate;";

        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );
            update_option( 'fa_userloginhostory_version', '1.0' );
            ulh_update_tables_when_plugin_updating();
    }


    //call when plugin is updated. 
//Actually it gets called every time 
//but the sql query execute only when there is plugin version difference
    function ulh_update_tables_when_plugin_updating() {
        global $wpdb;
            $oldVersion = get_option( 'fa_userloginhostory_version', '1.0' );
            $newVersion = '1.2';

            if ( !(version_compare( $oldVersion, $newVersion ) < 0) ) {
                return FALSE;
            }

        $charset_collate = $wpdb->get_charset_collate();
            $fa_user_logins_table = $wpdb->prefix . "fa_user_logins";

        $sql = "CREATE TABLE $fa_user_logins_table (
             id int(11) NOT NULL AUTO_INCREMENT,
       user_id int(11) ,
      `time_login` datetime NOT NULL,
      `time_logout` datetime NOT NULL,
       `time_last_seen` datetime NOT NULL,
      `ip_address` varchar(20) NOT NULL,
      `browser` varchar(100) NOT NULL,
      `operating_system` varchar(100) NOT NULL,
      `country_name` varchar(100) NOT NULL,
      `country_code` varchar(20) NOT NULL   ,                             
       PRIMARY KEY (`id`)
        ) $charset_collate;";

        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );
        update_option( 'fa_userloginhostory_version', $newVersion );
    }

    add_action('init', 'ulh_update_tables_when_plugin_updating');

J'espère que cela aide d'autres utilisateurs.

0
Faiyaz Alam