为插件添加数据表
August 14th, 2008 at 09:36pm 雪山飞猪
当你写插件的时候,你可能需要写东西到数据库中去,一般来说,有两种数据要存储,第一种是安装数据,一般存储在 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 值。并在文章结尾显示。


分享到 Twitter

1. askie | August 14, 2008 at 9:43 pm | #

[回复该留言]你这牛!哈哈!
2. Crazy Loong | August 14, 2008 at 11:08 pm | #
你忘了IF NOT EXISTS的存在了
[回复该留言]3. 雪山飞猪 | August 14, 2008 at 11:16 pm | #
什么意思?
[回复该留言]4. Crazy Loong | August 15, 2008 at 1:08 am | #
完全不用去判断表是否存在,直接把IF NOT EXISTS加到SQL语句里就OK了
[回复该留言]5. 雪山飞猪 | August 15, 2008 at 1:18 am | #
详细点!
[回复该留言]6. neekey | August 15, 2008 at 12:03 pm | #
浪费资源了点?
[回复该留言]7. 雪山飞猪 | August 15, 2008 at 12:26 pm | #
是有点,但是也是为了根据 PR 排名日志,而作的一个新的数据库。不然可以直接写道 postmeta 中去。
[回复该留言]8. 雀巢 | August 15, 2008 at 12:22 am | #
不错。可惜俺php不太会。只能看懂大概思路
[回复该留言]9. 白c | August 15, 2008 at 2:23 am | #
水煮鱼,我在看你的wp教程,中间8页9页的地方你说启动apache和mysql,但是我打死也启动不了,下面写的是
[回复该留言]busy…
apache started [80 port]
我不知道是不是设置错了还是什么,在网上搜了半天,也查看端口了,但还是找不到原因,不知你知道否?我很菜,才开始学,谢谢
10. 偶爱偶家 | August 15, 2008 at 9:09 am | #
这个不是启动了吗?
[回复该留言]11. Chris.Ro | August 15, 2008 at 5:44 am | #
猪,你的技术是自学还是哪里学的?
[回复该留言]12. 雪山飞猪 | August 15, 2008 at 12:27 pm | #
askie 高人指点的!
[回复该留言]13. 胡普照 | August 15, 2008 at 11:49 am | #
你好水煮鱼,可以帮我看下这是什么地方出了问题.
[回复该留言]我把站点转移到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
14. 雪山飞猪 | August 15, 2008 at 12:33 pm | #
你用的是那个版本?
[回复该留言]15. 胡普照 | August 15, 2008 at 12:43 pm | #
wp2.6 原先数据库是mysql 4.0.17-nt 空间是windows的系统
[回复该留言]新的空间Linux 数据库版本是mysql 5.0.51b-log
16. 雪山飞猪 | August 15, 2008 at 12:50 pm | #
我说你的 dashboard Chinese 用的是那个版本?
[回复该留言]17. 胡普照 | August 15, 2008 at 12:55 pm | #
中文 Dashboard 3.0
[回复该留言]18. 雪山飞猪 | August 15, 2008 at 12:57 pm | #
那就奇怪了。我在查查。
[回复该留言]19. 胡普照 | August 15, 2008 at 1:04 pm | #
在原来4.0的数据库里还OK 转到5.0数据库就不行了.那个中文 Dashboard插件禁用了,插件做得改动好像还在.
[回复该留言]20. 小鱼 | October 29, 2008 at 1:39 pm | #
我也遇到同样问题,说是禁用插件,问题是现在网址打不开,后台无法进入怎么禁用插件啊
[回复该留言]21. 雪山飞猪 | October 29, 2008 at 1:54 pm | #
ftp下删除插件。
[回复该留言]22. 小鱼 | October 29, 2008 at 2:23 pm | #
非常感谢,我刚才在ftp下删除了这个插件,不过首页就显示的全部乱码,而且好多错误,好像都是插件问题,是不是很多插件不支持LIUNX主机啊,麻烦帮我看看http://www.fishspace.com.cn/
[回复该留言]23. 雪山飞猪 | October 29, 2008 at 3:40 pm | #
我在看看,这个问题太奇怪了!
[回复该留言]