系统概述
本发布系统让你在本地用 Markdown 写文章和页面,一条命令直接发布到 WordPress,无需登录后台。
本地 Markdown → remark 解析 → HTML → WordPress REST API → 网站上线
核心文件:
| 文件 | 作用 |
|---|---|
publish.js |
单文件发布/更新 |
batch_publish.js |
批量发布(基于时间戳增量) |
.env |
存放 WordPress 站点地址和 API 凭据 |
.last-publish-time |
记录上次发布时间,批量模式跳过未修改的文件 |
目录结构
publisher/
├── posts/ # 文章目录
│ ├── 2024/
│ ├── 2025/
│ └── 2026/
├── pages/ # 页面目录
│ └── about-me.md
├── publish.js # 单文件发布脚本
├── batch_publish.js # 批量发布脚本
├── set_feature_image.js # 设置特色图片
├── .env # API 凭据(不入 git)
└── .last-publish-time # 时间戳记录
自动识别规则:posts/ 下的文件 → 文章,pages/ 下的文件 → 页面。
Front Matter 字段
---
title: 文章标题 # 必填
slug: my-article-slug # 必填,URL 标识(支持中文)
id: 123 # 可选,已有文章 ID(用于更新)
categories: [WordPress] # 可选,分类 slug 列表(必须已存在)
tags: [教程, 优化] # 可选,标签 slug 列表(必须已存在)
featured_image: 456 # 可选,特色图片的媒体库 ID
parent: 0 # 仅页面,父页面 ID
menu_order: 1 # 仅页面,菜单排序
---
⚠️
categories和tags必须使用 WordPress 中已存在的分类/标签 slug。如果写了不存在的,发布会报错中断,不会自动创建。
发布命令
# 发布单篇文章
node publish.js posts/2026/my-article.md
# 发布单个页面
node publish.js pages/about.md
# 批量发布所有修改过的文件
node batch_publish.js
# 只发布文章或页面
node batch_publish.js --posts
node batch_publish.js --pages
# 预览模式(不实际发布)
node batch_publish.js --dry-run
# 强制全量发布
node batch_publish.js --all
# 调试模式
$env:DEBUG_PUBLISH="1"; node publish.js posts/xxx.md
工作流程
flowchart TD
A[执行 node publish.js] --> B[解析 Front Matter]
B --> C{slug 是否为空?}
C -->|是| D[报错退出]
C -->|否| E[Markdown → HTML]
E --> F[检查分类/标签是否存在]
F --> G{存在?}
G -->|否| H[报错: 分类不存在]
G -->|是| I{id 或 slug 匹配已有文章?}
I -->|匹配| J[更新文章]
I -->|不匹配| K[创建新文章]
J --> L{front matter 有 id?}
K --> M[自动写入 id 到 MD 文件]
L -->|没有| M
L -->|有| N[完成]
M --> N
关键特性
自动 ID 回写:新文章发布成功后,系统自动把 WordPress 返回的文章 ID 写回 Markdown 文件的 front matter。下次修改这个文件时,系统通过 ID 精准更新,不会因 slug 变动而创建重复文章。
slug 保护:更新已有文章时,默认不修改 slug。即使你在 front matter 改了 slug,也只影响新文章,不会改已有文章的 URL。
Markdown 增强:
:::tip/:::warning/:::danger/:::info/:::note— Admonition 提示块【高亮文字】— 内联高亮提示- GFM 表格、Emoji (
:smile:) 完整支持 - 外链自动
target="_blank"
存在的不足与改进方向
🔴 影响效率
-
不支持本地图片上传
目前featured_image只能填 WordPress 媒体库中已存在的 ID。本地图片需要先手动上传到媒体库,再拿 ID。理想流程应该是:Markdown 里写→ 解析时自动上传 → 替换为 CDN URL。 -
分类/标签报错信息不够友好
目前报错Term slug not found: categories:新分类,但没有列出已有的所有分类供参考。可以改进为:”分类「新分类」不存在,当前可用分类:WordPress, 性能优化, 生活随笔”。 -
批量发布遇错即停
批量模式下一个文件失败,后续文件全部跳过。应该改为收集所有错误,最后汇总报告,不阻塞其他文件的发布。
🟡 缺少的高级功能
-
不支持定时发布
front matter 没有status: future+date支持,无法设置定时发布。 -
不支持文章摘要
没有excerpt字段,WordPress 只能自动截取前 55 字作为摘要,不可控。 -
不支持自定义字段
无法通过 front matter 设置 WordPress 自定义字段(post meta)。
🟢 代码质量
-
存在未清理的测试代码
addSignature()函数和remarkHighlightTipInline插件标注为”测试用,可以删除”,但仍在代码中。 -
addTargetBlank()域名硬编码无效
函数里判断yourdomain.com来决定是否为外链,实际上永远匹配不到,相当于所有链接都加了target="_blank"。应该改为读取.env中的站点域名。 -
.env解析过于简单
不支持引号内含空格的值,不支持行内注释,批量发布的--posts--pages与文件路径有命名歧义。
计划优先级
| 优先级 | 改进项 | 原因 |
|---|---|---|
| P0 | 本地图片自动上传 | 目前图片工作流太繁琐 |
| P1 | 错误汇总不中断 | 批量发布体验差 |
| P1 | 友好报错(列出现有分类) | 分类报错后不知道填什么 |
| P2 | 文章摘要支持 | 影响 SEO 和搜索展示 |
| P2 | 清理测试代码 | 代码整洁 |
| P3 | 定时发布 | 锦上添花 |
| P3 | 自定义字段 | 特殊需求 |
