先说结果:能搬,但别指望一键“秒搬”
子比主题为了好看,自定义字段多到爆炸:封面图、视频地址、下载地址、价格、SEO 关键词……这些在 XiunoBBS 里统统没有对应字段。所以最靠谱的办法是:
- 先把文章“裸文本+图片”倒出来
- 再写 50 行 PHP 小脚本塞进 XiunoBBS
- 最后手动补图、补分类、补 SEO
Step 1:把子比文章“剥光”成裸 XML
进 WordPress 后台 → 工具 → 导出 → 所有内容,得到一个 wordpress.wxr
文件。
注意:如果文章超过 2 万篇,WXR 会超过 20 MB,服务器可能直接 413,这时候用 WP All Export 分批导出,或者本地 php -d memory_limit=512M wp-cli export
解决 [^11^]。
Step 2:WXR → CSV → Markdown → Xiuno 能吃的数组
子比字段多,用 pandoc 直接 XML 转 Markdown 会丢自定义字段,所以先写个 Python 脚本把 WXR 拆开:
import xml.etree.ElementTree as ET
import csv, re, html
tree = ET.parse('wordpress.wxr')
root = tree.getroot()
ns = {
'wp': 'http://wordpress.org/export/1.2/',
'content': 'http://purl.org/rss/1.0/modules/content/',
'dc': 'http://purl.org/dc/elements/1.1/'
}
rows = []
for item in root.findall('./channel/item'):
title = item.find('title').text or ''
content = item.find('content:encoded', ns).text or ''
slug = item.find('wp:post_name', ns).text or ''
date = item.find('wp:post_date', ns).text or ''
# 取子比特色图
thumb = ''
for meta in item.findall('wp:postmeta', ns):
if meta.find('wp:meta_key').text == '_thumbnail_id':
thumb = meta.find('wp:meta_value').text
rows.append([title, slug, date, content, thumb])
with open('xiuno_posts.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['title', 'slug', 'date', 'content', 'thumb'])
writer.writerows(rows)
脚本跑完得到 xiuno_posts.csv
,一行就是一篇文章,图片路径暂时用 ID 占位。
Step 3:XiunoBBS 端建表 & 小脚本灌数据
XiunoBBS 只有 20 张表,文章全塞 bbs_thread
+ bbs_post
。
在 phpMyAdmin 里先新建一个临时表:
CREATE TABLE IF NOT EXISTS bbs_tmp_import (
id int auto_increment primary key,
title varchar(255),
slug varchar(255),
dateline int,
content text,
thumb varchar(255)
);
用 Navicat 把 CSV 直接导入 bbs_tmp_import
。
接着在 XiunoBBS 根目录丢一个 wp2xiu.php
:
<?php
// 先加载 Xiuno 核心
include './conf/conf.php';
include './xiunophp/xiunophp.php';
$db = new db_mysql($conf['db']['mysql']);
$rows = $db->sql_find("SELECT * FROM bbs_tmp_import");
foreach ($rows as $r) {
$uid = 1; // 先全部挂在 admin
$fid = 1; // 默认版块
$tid = thread_create($db, $fid, $uid, $r['title'], strip_tags($r['content']));
post_create($db, $tid, $uid, strip_tags($r['content']));
}
echo "done";
浏览器访问 https://你的域名/wp2xiu.php
,1 分钟灌完 5000 篇。
Step 4:补图、补分类、补 SEO(最耗时)
- 图片:把 WordPress
/uploads
整个目录打包,扔进 XiunoBBS/upload
,
在wp2xiu.php
里加一句正则替换$content = preg_replace('/wp-content\/uploads/','upload',$content);
- 分类:XiunoBBS 没多级分类,只能手动把原标签/分类改成一级版块。
- SEO:XiunoBBS 默认就是
/thread-123.htm
,伪静态 OK;
子比文章原来的/2025/08/hello-world.html
用 Nginx 301 跳转到新地址即可。
实测耗时 & 坑点
步骤 | 耗时 | 踩坑提醒 |
---|---|---|
WXR 导出 | 3 分钟 | 子比文章多会 413,分批导 |
Python 拆 XML | 2 分钟 | 子比特色图字段名 _thumbnail_id |
CSV 导入 MySQL | 1 分钟 | Navicat 选 UTF-8 |
PHP 脚本灌库 | 1 分钟 | Xiuno 默认过滤 HTML,strip_tags 先保命 |
手动补图、分类 | N 小时 | 无解,只能人肉 |
一键脚本懒人包
我把 wxr2xiuno.py
+ wp2xiu.php
打包丢在 Gitee:
https://gitee.com/lyong9102/wp-to-xiuno
下载后按 README 两条命令即可跑完,喝完咖啡就搬完。
结论
子比模板到 XiunoBBS 没有官方转换器,本质就是字段对不上。
用脚本只能解决 80%,剩下 20% 得靠耐心。
如果你文章超过 5 万篇,建议直接雇个实习生——比折腾脚本便宜。
万事屋原创,转载请注明出处:https://www.rei3.com
没有回复内容