git push,剩下的全部交给自动化通过这套工作流,你可以在本地使用 Markdown 精心撰写文章,一旦推送到 GitHub,GitHub Actions 会自动增量识别变动,并通过 NodeJS 脚本精准同步到 WordPress。
在仓库根目录下创建 .github/workflows/deploy-wp.yml,利用 tj-actions/changed-files 插件精准筛选出本次变动的 .md 文件。
name: Deploy Articles to WordPress
on:
push:
branches:
- main
paths:
- 'posts/**/*.md' # 仅监听 posts 文件夹下的 md 变动
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史以对比差异
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v44
with:
files: 'posts/**/*.md'
json: true # 输出为 JSON 格式方便 Node 解析
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run deploy script
env:
WP_URL: ${{ secrets.WP_URL }}
WP_USERNAME: ${{ secrets.WP_USERNAME }}
WP_PASSWORD: ${{ secrets.WP_PASSWORD }}
ADDED_FILES: ${{ steps.changed-files.outputs.added_files }}
MODIFIED_FILES: ${{ steps.changed-files.outputs.modified_files }}
run: node script/deploy.js
在 script/deploy.js 中接收 GitHub Actions 传入的环境变量,区分“新发布”和“更新”:
const fs = require('fs');
const path = require('path');
// 1. 解析 Actions 传过来的变动文件 JSON 数组
const addedFiles = process.env.ADDED_FILES ? JSON.parse(process.env.ADDED_FILES) : [];
const modifiedFiles = process.env.MODIFIED_FILES ? JSON.parse(process.env.MODIFIED_FILES) : [];
async function main() {
// --- 处理全新发布 ---
for (const filePath of addedFiles) {
console.log(`🚀 发现新文章: ${filePath}`);
// 调用 WP API -> POST /wp-json/wp/v2/posts
}
// --- 处理已有更新 ---
for (const filePath of modifiedFiles) {
console.log(`🔄 发现文章更新: ${filePath}`);
// 1. 根据 Markdown 里的 slug 查出 WordPress 对应的文章 ID
// 2. 调用 WP API -> POST /wp-json/wp/v2/posts/${postId}
}
}
main().catch(err => { console.error(err); process.exit(1); });
本地的 Markdown 文件和云端 WordPress 是分离的。推荐别名(Slug)匹配法:
在 Markdown 的 Frontmatter 头部定义一个固定的 slug: my-first-post。当文件更新时,NodeJS 脚本先请求 GET /wp-json/wp/v2/posts?slug=my-first-post 获取文章的数据库 ID,再执行更新。这样最省心,不需要把 ID 写回本地文件。
千万不要把 WordPress 的主密码写在代码或配置中。请按以下步骤操作:
Settings -> Secrets and variables -> Actions 中。