插件未在激活时创建第二个表

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 查询创建与现有表具有一对一关系的第二个表

Laravel 5.2 迁移第二个表时出现数据库迁移错误

sql server 2000返回在第一个表中但不在第二个表中的数据

如何在sqlite的数据库中添加第二个表?

如何使用 pyqt5 和 qt 设计器从主对话框窗口打开第二个窗口