激活时未创建插件的自定义数据库表

时间:2017-06-25 作者:Rich Bannon

首先,我要说的是,我知道还有其他关于这方面的帖子,并且有很多关于这个主题的文档,但这些资源都没有帮助我解决我的问题。

我是WordPress插件的初学者。这是我的第一次,所以我肯定我错过了一些简单的东西,但我所读到的一切都表明这应该是可行的。

插件激活没有问题,显示“我的菜单”,等等。但以下内容不会在数据库中创建新表。我删除了id之外的所有内容,只是为了看看它是否是SQL语法,但仍然没有结果。

register_activation_hook( __FILE__, \'pf_rb_install\' );      
function pf_rb_install() {
    global $wpdb;

    $table_name = $wpdb->prefix . \'pf_parts\';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE \'$table_name\' (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            PRIMARY KEY (id)
            ) $charset_collate;";

        require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
        dbDelta( $sql );    
    }
提前感谢您的帮助。

2 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

以下是的更新版本pf_rb_install().

在表创建SQL中,$table_name 不应在引号中。引号应该触发一个错误,该错误将出现在PHP的error.log 文件此外,在PRIMARY KEY (id) SQL语句的一部分。

register_activation_hook( __FILE__, \'pf_rb_install\' );
function pf_rb_install() {
    global $wpdb;
    $table_name = $wpdb->prefix . \'pf_parts\';
    $pf_parts_db_version = \'1.0.0\';
    $charset_collate = $wpdb->get_charset_collate();

    if ( $wpdb->get_var( "SHOW TABLES LIKE \'{$table_name}\'" ) != $table_name ) {

        $sql = "CREATE TABLE $table_name (
                        id mediumint(9) NOT NULL AUTO_INCREMENT,
                        PRIMARY KEY  (id)
                        ) $charset_collate;";

        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        dbDelta( $sql );
        add_option( \'pf_parts_db_version\', $pf_parts_db_version );
    }
}
该代码还添加了一个版本号,如果将来对数据库模式进行修改,该版本号将有所帮助。最后,添加了一个检查,以便仅当表不存在时才运行数据库创建代码。有关创建自定义表的更多信息,请参阅Codex文章Creating Tables with Plugins.

SO网友:Cedon

看起来像你的SQL 声明有点不对劲。尝试以下操作:

function pf_rb_install() {
    global $wpdb;

    $table_name = $wpdb->prefix . \'pf_parts\';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            PRIMARY KEY  (id)
            )
            COLLATE $charset_collate";

        require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
        dbDelta( $sql );    
}
注:PRIMARY KEY MUST 后面有两个空格。

结束

相关推荐

Split posts between databases

我的客户要求为基于WP的wordpress(单站点,而不是多站点)提供一个非常具体的解决方案。基本上,他想要的是,假设在1000篇文章之后,应该创建新的数据库(只有5个表,posts,posmeta和3个与分类相关的表),新的文章应该和所有的post meta一起存储在这个数据库中,直到它达到1000篇文章,然后处理重复。具有挑战性的部分是,所有这些数据库必须同时处于活动状态,因此WP应该能够同时访问来自主数据库和所有这些新创建的数据库(有5个表)的帖子。这可能需要hyperdb. 问题包括:如何告诉wp