it-swarm.com.de

Wie aktualisiere ich eine vorhandene Tabelle während ich das Plugin aktualisiere?

Ich habe ein neues Feld (time_last_seen) in meine Plugin-Tabelle (v1.1) eingefügt und dann mein Plugin als Version 1.2 in das WordPress-SVN-Repository hochgeladen. Wenn ich mein Plugin über das Admin-Panel aktualisiere, wird das Feld (time_last_seen) in der Tabelle nicht erstellt.

Folgendes habe ich versucht:

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() fügt nur eine Funktion hinzu, die aufactivationIhres Plugins ausgeführt werden soll, nicht beim Aktualisieren. Siehe the docs für alle Details, insbesondere diesen Teil:

3.1: Dieser Hook wird jetzt nur ausgelöst, wenn der Benutzer das Plugin aktiviert und nicht, wenn ein automatisches Plugin-Update stattfindet (# 14915).

Natürlich können Sie die Ausführung Ihres Hooks erzwingen, indem Sie Ihr Plugin deaktivieren und erneut aktivieren, aber Sie möchten auf keinen Fall, dass Ihre Benutzer dies tun müssen :)

Eine bessere Möglichkeit wäre, die 'Datenbankversion' Ihres Plugins zu verwalten - speichern Sie also möglicherweise die 'aktuelle Versionsnummer' Ihres Plugins in der Datenbank. Wenn Ihr Plugin ausgeführt wird, vergleichen Sie diese Versionsnummer mit der tatsächlichen Version Ihres Plugins. Sollte es jemals anders sein ...das ist, wenn Sie dieses Feld zur Datenbank hinzufügen möchten.

Für brandneue Installationen von v1.1 Ihres Plugins möchten Sie dies natürlich weiterhin so ausführen, wie Sie es gerade tun. Sie müssen nur den Upgrade-Pfad berücksichtigen, den vorhandene Benutzer - wie Sie in dieser Instanz - einschlagen.

Weiterführende Literatur, die ich zu diesem Thema auf jeden Fall empfehlen würde:

2
Tim Malone

laut der Antwort von Tim Malone habe ich diesen Arbeitscode:

 /* 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');

Hoffe das hilft anderen Usern.

0
Faiyaz Alam