用 Ghost 6.x Admin API 发布内容时踩的几个坑,记录下来省得下次再踩。

坑一:HTML 内容神秘消失

现象:POST /ghost/api/admin/posts/ 创建文章,传了 html 字段,返回成功,但文章正文是空的。

原因: Ghost 6.x 默认期望的内容格式是 Lexical(一种 JSON 结构),不是 HTML。如果你直接传 html 字段但不告诉 Ghost 这是 HTML,它会静默忽略。

解决: 在 URL 后面加 ?source=html

# 错误——html 被忽略
POST /ghost/api/admin/posts/

# 正确——Ghost 自动把 HTML 转成 Lexical
POST /ghost/api/admin/posts/?source=html

坑二:API 返回的 html 字段为 null

现象: 创建成功后,API 响应里的 html 字段是 null,以为内容没存进去。

原因: 这是正常的。Ghost 内部把 HTML 转成了 Lexical JSON 存储,Admin API 响应不返回 HTML 内容。

验证方法:Content API(公开的只读接口)来确认内容是否真的写进去了。

坑三:更新文章报 422 Validation Error

现象: 用 PUT 更新文章时返回 422,提示缺少 updated_at 字段。

解决: 先 GET 拿到 updated_at,再 PUT 时带上。

坑四:Slug 自动中文音译

现象: 标题是中文,Ghost 自动生成的 slug 又长又奇怪。

解决: 创建时显式指定英文 slug。

坑五:Docker 版邮件配置不生效

现象: 在 docker-compose 里配置了环境变量 mail__transport=SMTP,但 Ghost 仍然显示 mail: Direct

原因: Ghost 6.x Docker 版通过环境变量配置邮件是一个已知问题,很多人遇到,官方似乎没有修复。

解决: 目前没有好的解决方案。如果需要邮件功能,建议换其他平台(比如 Hugo + 静态站点)。