989 字
5 分钟
更换博客系统,从Typecho更换到Astro
2025-09-09
统计加载中...

前言#

博客已经建立7年了,最开始是使用WordPress,但后面因为太臃肿,最后更换了Typecho已经5年时间,其中换过好几个域名。

那么现在为什么要更换呢?今年看见了Astro这个框架,同时看见了Fuwari这个非常符合我审美的模板,我决定将博客更换到 Astro。

Astro是一个静态博客系统,使用Astro + Markdown + GitHub Pages进行搭建,使用Obsidian + Markdown进行文章编写,使用Astro进行博客渲染,有一些前端经验的我很容易上手修改一些想自定义的内容,使用基于Fuwari二次开发的Mizuki作为博客模板,同时我也是Mizuki维护者之一。

而博客构建托管使用的是腾讯云的EdgeOne Pages服务,CDN加速,以及全球的边缘节点,保证用户访问速度。且减少了购买服务器的成本。

链接#

Fuwari开源地址: https://github.com/saicaca/fuwari

Mizuki开源地址:https://github.com/matsuzaka-yuki/mizuki

导出Typecho文章#

首先需要将 Typecho 的数据导出并转换为 Markdown 格式,这里我们使用更简单的一个方法,使用PHP脚本直接从 Typecho 数据库导出文章。

  • 复制下方代码在typecho网站根目录创建converter.php文件
<?php
// 启用错误显示,方便调试
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 数据库配置
$dsn = 'mysql:host=localhost;dbname=数据库名';//数据源
$user = '数据库用户名';
$pwd = '数据库密码';
try {
// 连接数据库,添加错误模式
$pdo = new PDO($dsn, $user, $pwd, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
echo "数据库连接成功!\n";
// 检查并创建posts目录
if (!is_dir('posts')) {
if (!mkdir('posts', 0755, true)) {
throw new Exception("无法创建posts目录");
}
echo "已创建posts目录\n";
}
$sql = "
SELECT
c.title,
c.text,
c.slug,
c.created,
c.modified,
GROUP_CONCAT(DISTINCT t.name) as tags
FROM typecho_contents c
LEFT JOIN typecho_relationships r ON c.cid = r.cid
LEFT JOIN typecho_metas t ON r.mid = t.mid AND t.type = 'tag'
WHERE c.type = 'post' AND c.status = 'publish'
GROUP BY c.cid
ORDER BY c.created DESC
";
$stmt = $pdo->query($sql);
$posts = $stmt->fetchAll();
if (empty($posts)) {
echo "没有找到需要导出的文章\n";
exit;
}
echo "找到 " . count($posts) . " 篇文章,开始导出...\n";
foreach ($posts as $index => $post) {
// 使用标题作为文件名
$filename = sanitize_filename($post['title']);
// Windows系统下转换文件名编码为GBK,解决乱码问题
if (strpos(PHP_OS, "WIN") !== false) {
$filename = iconv("UTF-8", "GBK//IGNORE", $filename);
}
// 确保文件名唯一
$originalFilename = $filename;
$counter = 1;
$fullPath = "posts/{$filename}.md";
while (file_exists($fullPath)) {
$filename = $originalFilename . "-" . $counter++;
$fullPath = "posts/{$filename}.md";
}
// 处理日期
$pubDate = date('Y-m-d', $post['created']);
$updatedDate = date('Y-m-d', $post['modified']);
// 处理标签
$tags = $post['tags'] ? explode(',', $post['tags']) : [];
// 转义标签中的特殊字符
$tags = array_map(function($tag) {
return addslashes($tag);
}, $tags);
// 构建frontmatter
$frontmatter = "---\n";
$frontmatter .= "title: \"" . addslashes($post['title']) . "\"\n";
$frontmatter .= "published: $pubDate\n";
$frontmatter .= "description: \"\"\n";
$frontmatter .= "tags: [\"" . implode('", "', $tags) . "\"]\n";
$frontmatter .= "category: \"\"\n";
$frontmatter .= "draft: false\n";
$frontmatter .= "---\n\n";
// 组合内容
$content = $frontmatter . $post['text'];
// 写入文件
$result = file_put_contents($fullPath, $content);
if ($result === false) {
throw new Exception("无法写入文件: " . $fullPath);
}
echo "已导出 " . ($index + 1) . "/" . count($posts) . ": " . $post['title'] . "\n";
}
echo "所有文章导出完成!\n";
} catch (PDOException $e) {
die("数据库错误: " . $e->getMessage() . "\n");
} catch (Exception $e) {
die("错误: " . $e->getMessage() . "\n");
}
/**
* 清理文件名,移除特殊字符和路径分隔符
*/
function sanitize_filename($filename) {
// 替换所有不允许的字符,特别是路径分隔符/和\
$invalidChars = array(" ", "?", "\\", "/", ":", "|", "*", "\"", "<", ">");
$filename = str_replace($invalidChars, '-', $filename);
// 移除连续的短横线
$filename = preg_replace('/-+/', '-', $filename);
// 限制文件名长度,避免过长
$maxLength = 100;
if (strlen($filename) > $maxLength) {
$filename = substr($filename, 0, $maxLength);
}
// 移除首尾的短横线
return trim($filename, '-');
}
?>
  • 用文本编辑器打开converter.php将上方代码中 $dsn $user pwd的信息更改为你自己的数据库信息。
  • 打开你的服务器终端输入 php converter.php ,就会自动转换为md文件啦
  • md文件文件路径在post/文章名.md
更换博客系统,从Typecho更换到Astro
https://www.cuteleaf.cn/posts/practical-skills/migrate-from-typecho-to-astro/
作者
夏叶
发布于
2025-09-09
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时