插件未在激活时创建第二个表
Posted
技术标签:
【中文标题】插件未在激活时创建第二个表【英文标题】:Plugin not creating 2nd table on activation 【发布时间】:2016-12-06 21:43:01 【问题描述】:我为我的插件创建了第一个表,在添加更多功能后,我意识到我需要为其他类型的数据添加第二个表。
到目前为止,故障排除工作已经解决了 dbDelta() 没有对 sql 数据使用相同的变量名、将 dbDelta() 既作为组合 sql var($setup_sql .= '...'
而不是 $setup_sql = '...'
)运行的问题,同时也在运行代码作为一个简单的函数而不是一个类。
我什至尝试使用不同的名称运行单个表创建,只是为了检查代码是否有效,但它仍然没有创建另一个表。
我在所有这些测试中没有错误,出于所有意图和目的,Wordpress 似乎不允许插件创建多个表 - 但我知道这不是案例。
class activation_setup
public static function wpd_activate()
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$wpd_table_trig = $wpdb->prefix . 'wpd_triggers';
$setup_sql_trig = "CREATE TABLE $wpd_table_trig (
id int(11 ) NOT NULL AUTO_INCREMENT,
trigger varchar(255) DEFAULT NULL,
popup varchar(255) DEFAULT NULL,
notify varchar(255) DEFAULT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
dbDelta( $setup_sql_trig );
$wpd_table_sel = $wpdb->prefix . 'wpd_selections';
$setup_sql_sel = "CREATE TABLE $wpd_table_sel (
id int(11 ) NOT NULL AUTO_INCREMENT,
selected varchar(255) DEFAULT NULL,
session varchar(255) DEFAULT NULL,
ip varchar(255) DEFAULT NULL,
page varchar(255) DEFAULT NULL,
date varchar(255) DEFAULT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
dbDelta( $setup_sql_sel );
update_option('wpd_activated',true);
$activation_setup = new activation_setup();
register_activation_hook( __FILE__ , array( $activation_setup, 'wpd_activate' ) );
我非常想弄清楚为什么这段代码没有添加第二个表,即使在删除了重复的表代码并使用不同的表名运行它之后也是如此。
我浏览了大量博客文章和 Stack 答案,试图深入了解它。
任何帮助都会很棒。
【问题讨论】:
【参考方案1】:问题在于表定义。
您在表定义中写了trigger
,它也是 mysql 的关键字。
这就是问题所在。
此更改将解决您的问题。
填写字段名时使用“`”。
class activation_setup
public static function wpd_activate()
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$wpd_table_trig = $wpdb->prefix . 'wpd_triggers';
$setup_sql_trig = "CREATE TABLE $wpd_table_trig (
`id` int(11 ) NOT NULL AUTO_INCREMENT,
`trigger` varchar(255) DEFAULT NULL,
`popup` varchar(255) DEFAULT NULL,
`notify` varchar(255) DEFAULT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
dbDelta( $setup_sql_trig );
$wpd_table_sel = $wpdb->prefix . 'wpd_selections';
$setup_sql_sel = "CREATE TABLE $wpd_table_sel (
`id` int(11 ) NOT NULL AUTO_INCREMENT,
`selected` varchar(255) DEFAULT NULL,
`session` varchar(255) DEFAULT NULL,
`ip` varchar(255) DEFAULT NULL,
`page` varchar(255) DEFAULT NULL,
`date` varchar(255) DEFAULT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
dbDelta( $setup_sql_sel );
$activation_setup = new activation_setup();
register_activation_hook( __FILE__ , array( $activation_setup, 'wpd_activate' ) );
如果您想确保该触发器存在问题,请从触发器字段中删除“`”,然后再次激活插件。
【讨论】:
先生你太棒了。我无法告诉你我已经通过该代码多少次 - 以及无数其他示例 - 逐个数字地检查并且从未想过检查像这样的实际名称。适合我在我的 Sql 代码中不使用刻度。以上是关于插件未在激活时创建第二个表的主要内容,如果未能解决你的问题,请参考以下文章
使用 MS Access SQL 查询创建与现有表具有一对一关系的第二个表