我正在开发一个自定义wordpress插件,但我似乎不知道在安装插件时如何创建数据库。(或更新时)
当我四处搜索时,我想到了这一点,但这似乎没有任何作用。
function to_install() {
global $wpdb;
$sql = "CREATE TABLE to_issues (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(125) NOT NULL
);";
require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql);
add_option(\'to_db_version\', TO_VERSION);
}
function to_install_data() {
global $wpdb;
$welcome_name = "Hello";
$welcom_text = "Install successfull";
}
register_activation_hook(__FILE__, \'to_install\');
register_activation_hook(__FILE__, \'to_install_data\');
另一方面,在更新插件时,这会重新安装所有表吗?或者wordpress会正确处理这个问题吗?
最合适的回答,由SO网友:Stephen Harris 整理而成
您的SQL命令无效。错误显示:
WordPress数据库错误:[表定义不正确;只能有一个自动列,必须将其定义为键]创建表到\\u问题(id int(11)不为NULL auto\\u INCREMENT,name varchar(125)不为NULL)
尝试:
$sql ="CREATE TABLE {$wpdb->prefix}to_issues (
id int(11) unsigned NOT NULL auto_increment,
name varchar(125) NOT NULL,
PRIMARY KEY (id)
);";
请注意
dbDelta()
对传递给它的内容非常特别。例如,在
PRIMARY KEY
和
(id)
.
我已添加$wpdb->prefix
向表中添加(用户指定的)WordPress前缀。这是一个很好的实践,因为有些人在他们的数据库中安装了多个WordPress。
dbDelta“寄存器激活”仅在插件激活时触发,而不是在插件升级时触发。因此,当用户停用并激活插件时,dbDelta($sql)
已触发-这是有意的。dbDelta
(see source) 识别“创建”查询,并首先检查表是否已存在,如果不存在,则创建表。如果该表确实存在,它将检查每个字段是否与给定$sql
, 如果没有,则更新它们。如果该字段不存在,但在$sql
, 它已创建。
通过这种方式,您可以通过更改$sql
. 但是,在更新插件时,to_install
不会调用-因此您需要手动调用它admin_init
检查当前“数据库版本”后(TO_VERSION
) 是一个旧的。看见this post 有关激活/停用/卸载/更新过程的详细说明。。