如何实现修改数据库的WordPress插件更新?

时间:2012-10-06 作者:Misha Moroshko

我开发了一个WordPress插件,它有自己的几个数据库表。该插件在激活时创建这些表,在删除/卸载时删除这些表。

我必须实现插件的更新过程,更新插件的代码和表结构。最简单的情况是向其中一个表中添加一个新列。更复杂的情况是创建新的表结构并相应地更新内容。

您建议如何解决此问题?是否有任何内置的WordPress功能可以帮助您?

2 个回复
SO网友:Stephen Harris

简而言之,是的-$wpdbSee Codex 了解更多信息。

无论何时与自定义表(或任何表)交互,都应该$wpdb - 尤其要确保您熟悉prepare 方法,该方法可以帮助转义查询并防止注入。

您应该已经熟悉了,因为您应该使用它来创建表。在安装挂钩上,您应该有如下内容:

$charset_collate = \'\';
if ( ! empty($wpdb->charset) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
    $charset_collate .= " COLLATE $wpdb->collate";

//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
    id bigint(20) unsigned NOT NULL auto_increment,
    column_a varchar(255) default NULL,
    column_b varchar(255) default NULL,
    PRIMARY KEY  (id)
    ) $charset_collate; ";

require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql_custom_table);
该代码实际上在插件激活时运行(即不仅仅是安装)。因此,当有人自动更新插件时,它将运行。Note: 如果他们通过手动更换插件进行升级,那么它不会升级,因此您需要在admin_init 升级插件时(将版本号存储在选项表中,对照当前版本进行检查)

现在你通常不会想要CREATE TABLE 每次更新插件时都要运行的SQL命令-这是dBDelta() 进来了。

在运行上述命令之前,它会检查表是否存在。此外,它还检查列类型。因此,如果表不存在,它会创建它,如果存在,但某些列类型已更改,它会更新它们,如果列不存在,它会添加它。

不幸的是,如果您从上面删除一列,它不会自动删除该列。要删除列/表,您需要特别DROP 它们(先检查它们是否存在)。

SO网友:Brian C

现在正确的方法是将您的模式作为文件包含在插件源中,并使用内置WordPress函数dbDelta()根据需要使用该模式更新数据库。实际需要的代码非常简单:

$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );
这将根据需要为您创建和更新数据库。我上次检查时,它没有删除旧的未使用列,所以您需要通过版本检查进行编码。这是WordPress的一个漂亮功能,而且节省了大量时间。创建架构时要小心。在mysql模式导出中复制间距的sql文件,与dbDelta()代码完全一样,据说对间距非常挑剔。您还应该测试数据库的版本,如果它不是最新的,请调用上面的来更新数据库。您可能还需要进行特定的更新,以覆盖dbDelta()没有正确执行的更改(例如删除列)。很容易编写一个简单的逻辑if测试,查看版本是否已更新,并通过$wpdb进行这些手动更新。例如,您可以删除一个现在未使用的列。

$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
        $wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
        $wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
        . "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
        . "NOT NULL DEFAULT CURRENT_TIMESTAMP");

update_option(MY_DB_VERSION, $db_version);
这是从运行代码中简化出来的,如果我在简化发布过程中破坏了它,我深表歉意。

还要记住,从WordPress 3.9.2开始,WordPress并不总是在更新插件时运行激活挂钩(特别是,如果从仪表板更新页面进行大规模更新)。

结束

相关推荐

如何理解ACTIVE_PLUGINS OPTION_VALUE从数据库中启用和禁用某些插件?

谁能解释一下如何解释和理解WordPress中的active\\u plugins option\\u value字符串吗。然后使用此字符串/数组禁用和激活特定插件?以下是一个示例:a:8:{i:0;s:21:\"adrotate/adrotate.php\";i:1;s:19:\"akismet/akismet.php\";i:2;s:33:\"better-related/better-related.php\";i:3;s:17:\"clicky/clicky.php\";i:4;s:49:\"cu