我有这个功能,可以在激活插件时创建两个表。只创建wp\\u wpt\\u stats表,而不创建wp\\u wpt\\u列表。我知道dbdelta很挑剔,但我看不出我做错了什么。
global $wpt_db_version;
$wpt_db_version = "1.0";
function wpt_install() {
global $wpdb;
global $wpt_db_version;
$table_add_toplist = $wpdb->prefix . \'wpt_list\';
$table_add_wptstats = $wpdb->prefix . \'wpt_stats\';
$charset_collate = $wpdb->get_charset_collate();
//-----------------------table_one-----------------------------------
if($wpdb->get_var(\'SHOW TABLES LIKE \' . $table_add_toplist) != $table_add_toplist){
$sql_one = \'CREATE TABLE \' . $table_add_toplist . \'(
id INT(11) UNSIGNED AUTO_INCREMENT,
link_id INT(11),
visitor_ip VARCHAR(15)
click_at DATETIME NOT NULL,
site_votes INT(11),
on_page VARCHAR(255),
UNIQUE KEY id (id)
) \'. $charset_collate .\';\';
require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql_one);
}
//-----------------------table_two-----------------------------------
if($wpdb->get_var(\'SHOW TABLES LIKE \' . $table_add_wptstats) != $table_add_wptstats){
$sql_two = \'CREATE TABLE \' . $table_add_wptstats . \'(
id INT(11) UNSIGNED AUTO_INCREMENT,
link_id INT(11),
impressions INT(11),
inclick INT(11),
outclick INT(11),
PRIMARY KEY (id)
) \'. $charset_collate .\';\';
require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql_two);
}
add_option("wpt_db_version", $wpt_db_version );
}
register_activation_hook(__FILE__,\'wpt_install\');
最合适的回答,由SO网友:Tom J Nowell 整理而成
dbdelta
要求:
您必须在SQL语句中将每个字段放在自己的行上主键和主键定义之间必须有两个空格必须使用关键字key而不是其同义词索引,并且必须至少包含一个关键字不得在字段名称周围使用任何撇号或反勾号字段类型必须全部为小写
$sql_one = \'CREATE TABLE \' . $table_add_toplist . \'(
id INT(11) UNSIGNED AUTO_INCREMENT,
link_id INT(11),
visitor_ip VARCHAR(15)
click_at DATETIME NOT NULL,
site_votes INT(11),
on_page VARCHAR(255),
UNIQUE KEY id (id)
) \'. $charset_collate .\';\';
我们可以看到,您没有在每一行的末尾附加逗号:
link_id INT(11),
visitor_ip VARCHAR(15)
click_at DATETIME NOT NULL,
因此,SQL无效,如下所示
visitor_ip
结尾缺少逗号