如何在更新插件的同时更新已有的表?

时间:2016-05-22 作者:Faiyaz Alam

我在我的插件(v1.1)表中添加了一个新字段(time\\u last\\u),然后将插件作为1.2版上传到wordpress svn存储库。当我从管理面板更新插件时,它不会在表中创建字段(time\\u last\\u)。

以下是我尝试过的:

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\');

2 个回复
最合适的回答,由SO网友:Tim Malone 整理而成

register_activation_hook() 只附加一个函数以在插件激活时运行,而不是在更新时运行。看见the docs 有关详细信息,尤其是本部分:

3.1:此挂钩现在仅在用户激活插件时触发,而不是在插件自动更新时触发(#14915)。

当然,您可以通过停用和重新激活插件来强制运行钩子,但您肯定不希望用户必须这样做:)

一个更好的方法是管理插件的“数据库版本”,所以也许可以将插件的“当前版本”号存储在数据库中。当插件运行时,请对照插件的真实版本检查此版本号。如果有什么不同这就是要将此字段添加到数据库的时间。

当然,对于v1的全新安装。您仍然希望按当前状态运行此插件。您只需考虑现有用户(例如本例中的您)将采取的升级路径。

对于本主题,我建议您进一步阅读:

SO网友:Faiyaz Alam

根据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\');
希望这对其他用户有所帮助。

相关推荐

在现有WP_LIST_TABLE中添加和删除行操作

我想修改现有WP\\U List\\U表的行操作。例如,在后端的用户部分,我想删除;“编辑”;每个用户的选项。我还想添加新的操作,例如;书籍“;,这将列出该用户阅读的书籍(这与另一个插件一起使用)。我感觉这是某种过滤器,但在文档中找不到任何东西。请注意,我没有创建新表。这是一个现有的WordPress表(例如,用户)。我该怎么做?谢谢