我为我的wordpress插件创建了一个简单的类。主文件如下所示:
<?php
/*
* Plugin Name: Codes
* Description: Generates a coupon code after checkout
* Version: 0.1.0
* Author: XXX
*/
require_once(\'inc/DatabaseUtils.php\');
$codes = new Codes();
class Codes {
private $databaseUtils;
/**
* Create a new instance
*
* @param null
* @return void
*/
function __construct() {
$this->regsiter_hooks();
$this->databaseUtils = new DatabaseUtils();
}
/**
* Called on plugin activation
*
* @param null
* @return void
*/
function activate() {
$this->databaseUtils->setup_codes_table();
}
/**
* Called on plugin deactivation
*
* @param null
* @return void
*/
function deactivate() {
}
/**
* Register plugin hooks
*
* @param null
* @return void
*/
function regsiter_hooks() {
register_activation_hook(__File__, array($this, \'activate\'));
register_deactivation_hook(__File__, array($this, \'deactivate\'));
}
}
在文件夹“inc”中,我有一个数据库utils。php文件。这是一个类,具有在激活插件后在wordpress数据库中创建表的功能。内容如下:
<?php
class DatabaseUtils {
function setup_codes_table() {
global $wpdb;
global $charset_collate;
$table_name = $wpdb->prefix . \'pin\';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pincode` bignit(128) DEFAULT NOT NULL,
PRIMARY KEY (`id`)
)$charset_collate;";
require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
}
}
如果您看到了,我在主文件的激活方法中调用了该函数。但当我激活插件时,我的数据库中没有新表。
有人知道为什么吗?是否有方法调试register_activation_hook?
谢谢你的帮助!
最合适的回答,由SO网友:Jacob Peattie 整理而成
用于在中创建表的SQLdbDelta() 有非常具体的要求。从…起the codex:
您必须在SQL语句中将每个字段放在自己的行上主键和主键定义之间必须有两个空格必须使用关键字key而不是其同义词索引,并且必须至少包含一个关键字键后面必须跟一个空格,然后是键名,然后是空格,然后是带字段名的开括号,然后是闭括号不得在字段名称周围使用任何撇号或反勾号字段类型必须全部为小写IF NOT EXISTS 使用时也不需要dbDelta(), 其目的是仅在必要时根据SQL自动对数据库进行更改。
因此,您的SQL应该如下所示:
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
pincode bigint(128) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
您的SQL缺少后面的2个空格
PRIMARY KEY. 你还有一个拼写错误,上面写着
bignit 相反,如果
bigint 对于
pincode, 和
DEFAULT NOT NULL 不是有效的SQL,应该是
NOT NULL.
我还删除了背景标记,并在前面添加了一个空格$charset_collate; 与法典中的风格保持一致,但我不确定它们是否会引起问题。