web-dev-qa-db-ja.com

プラグインを更新しながら既存のテーブルを更新するにはどうすればいいですか?

私は自分のプラグイン(v1.1)テーブルに新しいフィールド(time_last_seen)を追加し、それから私のプラグインをバージョン1.2としてwordpress svnリポジトリにアップロードしました。管理パネルからプラグインを更新しても、テーブルにフィールド(time_last_seen)が作成されていません。

これが私が試したことです。

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()は、更新時ではなく、プラグインのアクティベーションで実行される関数のみを添付します。詳しくは、 ドキュメント をご覧ください。

3.1:このフックはユーザがプラグインを起動したときにのみ起動され、自動プラグインの更新が発生したときには起動されません(#14915)。

もちろん、プラグインを無効にしてから再度有効にすることでフックを強制的に実行することもできますが、確かにユーザーにこれを行わせたくないと思うでしょう。

もっと良い方法はあなたのプラグインの 'データベースバージョン'を管理​​することでしょう - おそらく、あなたのプラグインの '現在のバージョン'番号をデータベースに保存してください。プラグインが実行されたら、このバージョン番号を実際のバージョンのプラグインと比較して確認してください。それが今までと違っていたら...それはあなたがデータベースにこのフィールドを追加したいときです。

もちろん、あなたのプラグインのv1.1のまったく新しいインストールのために、あなたはまだあなたが現在いるようにこれを実行したいです。既存のユーザー(この例では自分自身など)がたどるアップグレードパスも考慮する必要があります。

私はこのトピックについて絶対にお勧めしますそれ以上の読み:

2
Tim Malone

tim Maloneによる回答によれば、私はこの実用的なコードを持っています。

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

これが他のユーザーに役立つことを願っています。

0
Faiyaz Alam