首页 WordPress 使用github action自动发布Markdown和HTML到WordPress
GitOps 自动化:从 Git Push 到 WordPress 自动发布

GitOps 驱动的 Headless CMS 自动化

🚀 只要 git push,剩下的全部交给自动化

通过这套工作流,你可以在本地使用 Markdown 精心撰写文章,一旦推送到 GitHub,GitHub Actions 会自动增量识别变动,并通过 NodeJS 脚本精准同步到 WordPress。

✍️ 编写/修改 Markdown
💻 Git Push 触发
🔍 Actions 识别变动
🤖 NodeJS 调用 WP-API

第一步:配置 GitHub Actions 工作流

在仓库根目录下创建 .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

第二步:编写 NodeJS 脚本接收并处理

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); });

💡 避坑指南与最佳实践

⚠️ 1. 精准匹配:更新时如何确定文章 ID?

本地的 Markdown 文件和云端 WordPress 是分离的。推荐别名(Slug)匹配法

在 Markdown 的 Frontmatter 头部定义一个固定的 slug: my-first-post。当文件更新时,NodeJS 脚本先请求 GET /wp-json/wp/v2/posts?slug=my-first-post 获取文章的数据库 ID,再执行更新。这样最省心,不需要把 ID 写回本地文件。

🔒 2. 安全第一:凭据请使用 Application Passwords

千万不要把 WordPress 的主密码写在代码或配置中。请按以下步骤操作: