989 字
5 分钟
更换博客系统,从Typecho更换到Astro
前言
博客已经建立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/ 部分信息可能已经过时