每刷新一次插件设置页,debug.log 就多一条 WordPress database error Table 'wp_abc_stats' already exists for query CREATE TABLE。停用再启用一次,同样的报错又刷一遍,后台顶部一点提示都没有。日志里能对上时间点,这种反而好排。
建表代码被直接写在插件主文件里,每次请求都会执行一遍,激活钩子只是顺带又调了一次。dbDelta 本身能容忍表已存在,可 CREATE TABLE 后面少了 IF NOT EXISTS,就会先撞一次错再往下走。这一点先确认清楚,后面就不用反复试。
global $wpdb;
$table = $wpdb->prefix . "abc_stats";
require_once ABSPATH . "wp-admin/includes/upgrade.php";
dbDelta("CREATE TABLE IF NOT EXISTS $table (id bigint unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB");
围绕「dbDelta 重复建表」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:把建表函数收进单独的文件 只在激活回调里引入一次;建表语句交给 dbDelta 之前先确认表名拼上了前缀;把主文件里直接执行的那段删掉 改成版本号变化时才跑。
结果对不对很好判断,刷新后台页面后 debug.log 不再新增 already exists,插件设置页可以反复打开不报错。
