简单记录 Node 调用 wordpress REST API 方法

164 阅读3分钟

前言

记录node调用 wordpress 提供的 REST API 方法,实现 post 和 media 的增删改查。

运行环境

  • node v20+
  • wordpress v6.7.1

使用

使用 node 调用,总体上有两种方法:

  • 使用 wpapi 插件,官方文档:文档
  • 原生方式调用; 如果是 node 内部调用,推荐直接使用 wpapi 插件,如果需要提供示例,供其他语言使用,则原生的方式更方便其他人进行移植和理解

wpapi 插件使用

  1. 安装依赖
npm install --save wpapi
  1. 引入使用
var WPAPI = require('wpapi');
  1. 登录鉴权
  • 部分接口需要用户的权限,如文章的新增和修改。在当前版本下的 wordpress 中,可以通过用户名和密码进行登录,也可以使用 wordpress 的应用程序密码进行登录。
  • 应用程序密码:因为账号的登录密码相对比较敏感,因此wordpress 支持在用户下创建应用程序密码,该密码专门用来REST API 的鉴权验证,继承账号的权限。
  • 应用程序密码需要注意两点:
    • 站点必须是 https 站点,否则不能启用该功能;
    • 如果使用应用程序密码进行校验,那么用户名需要使用账号的用户名,而非创建应用程序密码的名称。
var wp = new WPAPI({
  endpoint: 'https://www.test.com/blog/wp-json',
  username: 'node_api', // 账号
  password: 'xxxx xxxx xxxx xxxx xxxx xxxx' // 应用程序密码
});
  1. Post 创建示例
  • 详细使用方式推荐官网阅读
wp.posts().create({
  title: 'node create Title2',
  conent: '<p>222</p>',
  status: 'publish',
}).then((res) => {
  console.log('res', res);
}).catch(e => {
  console.log('create error', e)
})

node 原生方式

  • 原生方式的需求是因为需要为其他人提供接口的使用案例,而这种使用案例采用 wpapi 的方式不太合理,最好提供没有其他依赖项的使用方式。
  • 接口api参考官方文档:文档
  1. post 文章(fetch 方式)
const siteUrl = 'https://test.com/blog';

// 用户名和应用密码(或普通密码)
const username = 'name';
const appPassword = 'xxxx xxxx xxxx xxxx xxxx xxxx';

// 创建文章的数据
const postData = {
    title: 'Hello World',
    content: 'This is my first post using the WordPress REST API!',
    status: 'publish' // 可选值:'draft', 'publish', 'pending', 'private'
};

// 将用户名和密码组合成 Base64 编码的字符串
const auth = btoa(`${username}:${appPassword}`);

fetch(`${siteUrl}/wp-json/wp/v2/posts`, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Basic ${auth}`
    },
    body: JSON.stringify(postData)
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch((error) => console.error('Error:', error));
  1. post 媒体 (axios 方式)
    • 由于 node 原生 fetch 的兼容性太差,对于媒体文件的处理有问题,无法正常上传,因此改成 axios 来请求,实测这里改成 node-fetch 插件也可以正常执行,只有原生fetch不行。

const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');
const path = require('path');

const siteUrl = 'http://test.com/blog';
const username = 'node_api';
const appPassword = 'xxxx';
const filePath = path.resolve(__dirname, './test.png');

const fileStream = fs.createReadStream(filePath);

const formData = new FormData();
formData.append('file', fileStream);

const auth = Buffer.from(`${username}:${appPassword}`).toString('base64');

const config = {
  method: 'post',
  url: `${siteUrl}/wp-json/wp/v2/media`,
  headers: {
    Authorization: `Basic ${auth}`,
    ...formData.getHeaders(),
  },
  data: formData,
};

axios
  .request(config)
  .then((response) => {
    console.log(JSON.stringify(response.data));
  })
  .catch((error) => {
    console.error('Error:', error);
  });

注意

  • 如果安装了 Basic Authentication 插件 ,则只能通过账号密码进行鉴权验证,无法使用应用程序密码,插件的安装需要谨慎。
  • 使用应用程序密码校验,需要注意账号对应的是 wordpress 登录账号,而非创建应用程序密码时的名称(吐个槽,这里极度不符合常理。。)
  • node 原生 fetch 尽量不要使用,兼容性问题太坑了。