这里发生了几件事
首先,你的dbDelta
呼叫从未收到CREATE
SQL语句。$sql
仅当if语句为true时定义,并且如果开发人员环境设置正确,则运行此代码应生成PHP警告。你真的在跑步dbDelta(\'\');
dbDelta
但已经进行了此检查。它不是为了创建表,而是为了更新它们的模式,因此名称中有“delta”部分,因此立即的改进是:
// not guaranteed to work
function activate() {
global $wpdb;
$table_name = $wpdb->prefix . "event";
$sql = "CREATE TABLE" . $table_name . "(
id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
dateOfEvent DATETIME DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
eventName VARCHAR(100) DEFAULT \'\' NOT NULL,
PRIMARY KEY (id)
) $charset_collate";
require_once(ABSPATH . "wp-admin/includes/upgrade.php");
dbDelta($sql);
}
最后,SQL语句可能有效,但格式不正确。
谷歌搜索dbDelta
揭示this codex page 第二个结果是,按照以下说明:
您必须在SQL语句中将每个字段放在自己的行上主键和主键定义之间必须有两个空格必须使用关键字key而不是其同义词索引,并且必须至少包含一个关键字键后面必须跟一个空格,然后是键名,然后是空格,然后是带字段名的开括号,然后是闭括号不得在字段名称周围使用任何撇号或反勾号字段类型必须全部为小写
您的字段类型都是大写,dbDelta
要求它们都是小写的PRIMARY KEY
以及(id)
以下是法典中的示例:
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
name tinytext NOT NULL,
text text NOT NULL,
url varchar(55) DEFAULT \'\' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
dbDelta
是
EXTREMELY 对其输入内容挑剔且具体。仅仅因为它是有效的SQL并不意味着它是有效的
dbDelta
输入请非常仔细地遵循指南和说明。
侧注创建一个名为event
并使用发布后日期,而不是dateOfEvent
. 使用pre_get_posts
筛选以修改显示的帖子,以便显示将来的帖子
这将非常容易做到,使用WordPress中的缓存系统,为您提供URL即插即用、免费GUI、导入/导出支持,并且有大量插件已经做到了这一点,您可以使用它们。
如果可以使用自定义post类型,请不要使用自定义表和原始SQL语句