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)'];
}

转载自:超文本笔记