Typecho 组装数据库请求以获取任意数据
前言
- 制作 Typecho 主题时,经常用到一些没有现成获取方法的数据,需要自己组装数据库请求来获取
- 本文借助 “获取 Typecho 站点全站文章总数” 这个例子,描述这一过程
第一步:了解 Typecho 的数据库结构
- 参见官方文档:《Typecho数据库设计》
设计很简洁,这里不赘述,官方文档年久失修,建议参考着看一下自己的数据库
- 比如 metas 表中的 parent 字段就没有出现在官方文档中
- 我们要统计全站文章总数,要关注的是表
contents
第二步:写一个函数
统计全站的文章总数,就是要统计 contents 表中 type = post
的记录数,代码如下
function countPosts() {
$db = Typecho_Db::get();
$count = $db->fetchRow(
$db->select('COUNT(1)')->from('table.contents')->where('type = ?', 'post')
);
return $count['COUNT(1)'];
}
我们可以自由增加其他条件,有 SQL 基础的一看就明白了
比如只想获取已经公开发布的文章,可以增加 status 条件
$count = $db->fetchRow(
$db->select('COUNT(1)')
->from('table.contents')
->where('type = ?', 'post')
->where('status = ?', 'publish')
);
Typecho 的文档比较简陋,有些字段的取值范围在文档中并没有列出,可以自行去数据库中查看
第三步:在主题中使用
- 将上述代码添加到主题的 functions.php 文件
- 在需要显示数量的地方,使用
<?php countPosts() ?>
调用
第四步:举一反三
- 获取 Typecho 站点分类的数量
function countCategories() {
$db = Typecho_Db::get();
$count = $db->fetchRow(
$db->select('COUNT(1)')
->from('table.metas')
->where('type = ?', 'category')
);
return $count['COUNT(1)'];
}
- 获取 Typecho 站点全部一级分类的数量
function countCategories() {
$db = Typecho_Db::get();
$count = $db->fetchRow(
$db->select('COUNT(1)')
->from('table.metas')
->where('type = ?', 'category')
->where('parent = ?', '0')
);
return $count['COUNT(1)'];
}
- 获取 Typecho 站点全部评论的数量
function countComments() {
$db = Typecho_Db::get();
$count = $db->fetchRow(
$db->select('COUNT(1)')
->from('table.comments')
->where('status = ?', 'approved'));
return $count['COUNT(1)'];
}
转载自:超文本笔记