前言
记录node调用 wordpress 提供的 REST API 方法,实现 post 和 media 的增删改查。
运行环境
- node v20+
- wordpress v6.7.1
使用
使用 node 调用,总体上有两种方法:
- 使用
wpapi插件,官方文档:文档 - 原生方式调用;
如果是 node 内部调用,推荐直接使用
wpapi插件,如果需要提供示例,供其他语言使用,则原生的方式更方便其他人进行移植和理解
wpapi 插件使用
- 安装依赖
npm install --save wpapi
- 引入使用
var WPAPI = require('wpapi');
- 登录鉴权
- 部分接口需要用户的权限,如文章的新增和修改。在当前版本下的 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' // 应用程序密码
});
- 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参考官方文档:文档
- 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));
- 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 尽量不要使用,兼容性问题太坑了。