当你写插件的时候,你可能需要写东西到数据库中去,一般来说,有两种数据要存储,第一种是安装数据,一般存储在 options 表中,使用 WordPress 的 options 机制来实现。第二种是数据,可以存储到 postmeta 表或者 usermeta 表中。如果数据特别多,就需要自己创建数据库了。这篇文章就讲讲如何在写插件时候创建数据库。一般在写插件时候创建数据库有如下三个步骤:
- 创建一个添加新数据表的 PHP 函数。
- 保证插件启动的时候调用这个插件。
- 如果新版本有不同的数据表结构,创建一个升级函数。
今天我就结合我以前写的 Google PageRank for WordPress 讲解下这个过程,其中的第三步,由于没有数据库的升级,不涉及,如果你要了解这个东东,请参考 Codex 文档:Creating Tables with Plugins,这篇也是很多参考这里的。
创建一个添加新数据表的 PHP 函数
我们这个插件的安装函数叫做:google_pagerank_install。
1. 数据库表前缀
默认 WordPress 数据库标签前缀都是 wp_,但是有人如果在一个数据库安装两个及以上 WordPress,就需要在 wp-config.php 设置 WordPress 数据库表前缀来区别,所以我们向 WordPress 数据库添加新表的时候,要先找找到数据库表前缀。我们可以在变量 $wpdb->prefix 找到。代码如下:
function google_pagerank_install () { global $wpdb; $table_name = $wpdb->prefix . "googlepr";
2. 判断表是否存在
可以通过一条 SHOW TABLES SQL 查询来判断。
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
3. 创建数据表
这步就是实际来创建一个数据表了。我们这个表有三个字段,post_id 日志的 ID,外键。pr 该日志 ID 对应页面的 PR,time 更新时间。由于 PR 更新不是每天都发生的。所以我们可以设置上次查询 PR 的时间,然后在一段时间间隔内都不去查询,直接在数据库中调用。
这里我不用直接的 SQL 查询来创建,而是使用在 wp-admin/upgrade-functions.php(我们需要导入该文件,默认是不会导入的)中的 dbDelta。dbDelta 函数会检查当前的表结构,和需要的表结构进行比较,所以无论添加或者修改表都会非常方便。关于具体怎样使用 dbDelta,详细可以看 wp-admin/upgrade-schema.php 中的例子。
$sql = "CREATE TABLE " . $table_name . " ( post_id bigint(20) NOT NULL, pr int(2) NOT NULL default '0', time datetime NOT NULL default '0000-00-00 00:00:00', UNIQUE KEY post_id (post_id) );"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql);
最后这个 google_pagerank_install 函数为:
function google_pagerank_install () { global $wpdb; $table_name = $wpdb->prefix . "googlepr"; if($wpdb->get_var("show tables like '$table_name'") != $table_name) { $sql = "CREATE TABLE " . $table_name . " ( post_id bigint(20) NOT NULL, pr int(2) NOT NULL default '0', time datetime NOT NULL default '0000-00-00 00:00:00', UNIQUE KEY post_id (post_id) );"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } }
保证插件启动的时候调用这个插件
我们使用 register_activation_hook 调用上面创建数据表的函数。
register_activation_hook( __FILE__,‘google_pagerank_install‘);
参考:Creating Tables with Plugins
最后欢迎大家使用我的 Google PageRank for WordPress,它能够获取每篇日志的 PR 值。并在文章结尾显示。


你这牛!哈哈!
支持 反对
你忘了IF NOT EXISTS的存在了
支持 反对
什么意思?
支持 反对
完全不用去判断表是否存在,直接把IF NOT EXISTS加到SQL语句里就OK了
支持 反对
详细点!
支持 反对
浪费资源了点?
支持 反对
是有点,但是也是为了根据 PR 排名日志,而作的一个新的数据库。不然可以直接写道 postmeta 中去。
支持 反对
不错。可惜俺php不太会。只能看懂大概思路
支持 反对
水煮鱼,我在看你的wp教程,中间8页9页的地方你说启动apache和mysql,但是我打死也启动不了,下面写的是
busy…
apache started [80 port]
我不知道是不是设置错了还是什么,在网上搜了半天,也查看端口了,但还是找不到原因,不知你知道否?我很菜,才开始学,谢谢
支持 反对
这个不是启动了吗?
支持 反对
猪,你的技术是自学还是哪里学的?
支持 反对
askie 高人指点的!
支持 反对
你好水煮鱼,可以帮我看下这是什么地方出了问题.
我把站点转移到Linux下的虚拟主机后,结果出不来了.页面显示:
Fatal error: Cannot use string offset as an array in /home/hupuzhao/wwwroot/wp-content/plugins/wordpress-chinese-planet/dashboard_chinese.php on line 27
支持 反对
你用的是那个版本?
支持 反对
wp2.6 原先数据库是mysql 4.0.17-nt 空间是windows的系统
新的空间Linux 数据库版本是mysql 5.0.51b-log
支持 反对
我说你的 dashboard Chinese 用的是那个版本?
支持 反对
中文 Dashboard 3.0
支持 反对
那就奇怪了。我在查查。
支持 反对
在原来4.0的数据库里还OK 转到5.0数据库就不行了.那个中文 Dashboard插件禁用了,插件做得改动好像还在.
支持 反对
我也遇到同样问题,说是禁用插件,问题是现在网址打不开,后台无法进入怎么禁用插件啊
支持 反对
ftp下删除插件。
支持 反对
非常感谢,我刚才在ftp下删除了这个插件,不过首页就显示的全部乱码,而且好多错误,好像都是插件问题,是不是很多插件不支持LIUNX主机啊,麻烦帮我看看http://www.fishspace.com.cn/
支持 反对
我在看看,这个问题太奇怪了!
支持 反对
我也是这样怎么办啊?
支持 反对