把 WordPress 变成 BaaS 服务:API 调用指南

有了前面两篇内容的铺垫,我们来聊聊 WordPress 作为 CMS / BaaS 服务使用时绕不开的问题,API 调用。

这篇内容同样的,会尽量少贴代码,简单的讲清楚一件事,降低阅读负担。

写在前面

首先,我们需要进行清晰的名词定义,这里指的 “API 调用”是能够通过外部程序访问的 WordPress API 可编程接口,而非 WordPress 暴露给内部生态系统中的主题、插件工具开发者使用的 “内部 API”。

WordPress 团队主要提供过两种 WordPress 公开 API 调用方案。

WordPress 命令行工具

2011 年末,官方推出了 WP-CLI,一个用于与 WordPress 网站交互和进行管理的命令行工具。十年过去,我们可以在 WordPress 项目中的 WP CLI 页面看到它不仅仅还在更新,支持了各种各样的功能,还有持续围绕它的活动(Hack Day、极客日)。官方更是为它单独制作了一个 WP CLI 官方网站,希望让更多的人了解、安装和使用它。当然,GitHub 上的开源项目 wp-cli/wp-cli 的更新也非常的规范和持续,显得项目相对比较可靠。

WordPress REST API

另外一种,则是 REST API,使用通用的 JSON 格式来与 WordPress 应用进行数据交互。自 2017 年发布的 WordPress 4.7.1 版本引入,被持续更新到 WordPress 5.6 版本。有许多知名的网站使用了这种方式,包括 WordPress.com、Wired、TechCrunch、The New York Times。其实,国内也有不少基于 WordPress API 重新封装的内容网站,或者内部发布系统,还有一些网站基于它的架子从小做到了上市,毕竟它是全球使用量最大的 CMS 方案。

项目同样在 GitHub 上进行了开源 wp-cli/restful,隶属于上面 WP CLI 分组中。可惜的是,在 2022 年,有一个社区的用户向官方提问这个项目是否还在维护,得到的答复是否定的,项目不再积极维护,不过官方说社区用户依旧可以提交 PR 来做一些细微的改进。

与此同时,项目的官方网站 https://wp-api.org 网站证书过期,网站被设置自动重定向到 WordPress 文档页面,原始网站仅留存了同样证书过期的日语版网站。

不过,庆幸的是,在 WordPress 最新发布的 6.5.0 版本变更记录中,依旧对 REST API 功能做了保留和支持。社区中也依旧有许多方便的可以调用的 SDK 方案和资料参考。

让我们分别来聊聊这两种 API 方案的使用方法和细节注意事项。

方案一:WP CLI 的使用

在 WP CLI 官方网站 中,我们能够得到 WP CLI 的下载、安装方法。

# 下载 CLI 程序
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

# 验证程序正确
php wp-cli.phar --info

# 赋予执行权限,完成设置
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

接着,我们使用 wp cli 就能够简明扼要的看到能使用它来干什么了:

# wp cli
usage: wp cli alias <command>
   or: wp cli cache <command>
   or: wp cli check-update [--patch] [--minor] [--major] [--field=<field>] [--fields=<fields>] [--format=<format>]
   or: wp cli cmd-dump 
   or: wp cli completions --line=<line> --point=<point>
   or: wp cli has-command <command_name>...
   or: wp cli info [--format=<format>]
   or: wp cli param-dump [--with-values] [--format=<format>]
   or: wp cli update [--patch] [--minor] [--major] [--stable] [--nightly] [--yes] [--insecure]
   or: wp cli version 

See 'wp help cli <command>' for more information on a specific command.

不过,倘若你想要在一般的容器环境(非 Rootless Docker)运行,那么你将会收到类似下面的错误日志。

Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress installation exists under.

If you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this site will then have full control of your server, making it quite DANGEROUS.

If you'd like to continue as root, please run this again, adding this flag:  --allow-root

If you'd like to run it as the user that this site is under, you can run the following to become the respective user:

    sudo -u USER -i -- wp <command>

在 GitHub 社区中,曾经有过关于它的讨论,从 2017 年开始,社区就在推荐大家使用 alias 功能重写 wp 命令,来将 --allow-root 参数添加到真实运行的命令中。

不过,其实在 2020 年的一个提交中,就有人支持了从环境变量设置这个参数,解决了在 Docker 容器环境中的使用体验问题,毕竟在 Docker 环境中,每次都额外指定 --allow-root 还是很麻烦的。

所以,我们可以在封装镜像 Dockerfile 的时候,指定下面的环境变量,来让 wp cli 始终丝滑可用。

ENV WP_CLI_ALLOW_ROOT=1

有了 wp cli 之后,我们就能够对 WordPress 资源进行 CRUD 了。比如,你想列举所有的文章,只需要执行下面的命令:

# wp post list

+----+--------------+-------------+---------------------+-------------+
| ID | post_title   | post_name   | post_date           | post_status |
+----+--------------+-------------+---------------------+-------------+
| 5  | 一篇新的内容   | 5           | 2024-04-17 13:58:49 | publish     |
| 1  | 世界,您好!   | hello-world | 2024-04-17 13:53:42 | publish     |
+----+--------------+-------------+---------------------+-------------+

至于,增删改,和操作其他的资源,比如图片或者链接,或者更新具体设置,参考这个 WP CLI 命令的在线文档 即可。

方案二:WP REST API

虽然上文中提到了 WP REST API 当前的窘况,但好在目前 6.5.0 版本中,官方还是对它进行了支持,虽然没有明确文档告知用户该如何使用(应该是暂时减少支持工作消耗的开发同学的精力)。

在核心文件 wp-includes/functions.php 中,我们能够看到新增的函数 wp_is_serving_rest_request

function wp_is_serving_rest_request() {
	return defined( 'REST_REQUEST' ) && REST_REQUEST;
}

这里逻辑非常简单,根据用户是否明确定义 REST_REQUEST 常量,并且常量的取值为“真”,来开启 WP REST API 能力。

那么,我们就只需要在 wp-config.phpwp-config-docker.php (如果你使用 Docker 运行)中添加下面的代码即可:

# Enable WP REST API, by @soulteary
if ( ! defined( 'REST_REQUEST' ) ) {
	define('REST_REQUEST', true)
}

当我们添加完毕代码后,访问 http://localhost:8080/?rest_route=/wp/v2/posts 就能够看到以 JSON 格式展示的网站文章数据啦,比如:

[{"id":1,"date":"2024-04-17T13:53:42","date_gmt":"2024-04-17T05:53:42","guid":{"rendered":"http://localhost:8080/?p=1"},"modified":"2024-04-17T13:53:42","modified_gmt":"2024-04-17T05:53:42","slug":"hello-world","status":"publish","type":"post","link":"http://localhost:8080/?p=1","title":{"rendered":"世界,您好!"},"content":{"rendered":"\\n<p>欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!</p>\\n","protected":false},"excerpt":{"rendered":"<p>欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!</p>\\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http://localhost:8080/index.php?rest_route=/wp/v2/posts/1"}],"collection":[{"href":"http://localhost:8080/index.php?rest_route=/wp/v2/posts"}],"about":[{"href":"http://localhost:8080/index.php?rest_route=/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"http://localhost:8080/index.php?rest_route=/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"http://localhost:8080/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1"}],"version-history":[{"count":0,"href":"http://localhost:8080/index.php?rest_route=/wp/v2/posts/1/revisions"}],"wp:attachment":[{"href":"http://localhost:8080/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http://localhost:8080/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"http://localhost:8080/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}]

当然,如果我们在 WordPress 后台中设置了任意类型的“固定链接”,开启了链接重写功能,我们的访问地址就可以改成更好看一些的 http://localhost:8080/wp-json/wp/v2/posts 啦。

当然,在项目的 GitHub 社区里,我们能够找到许多 SDK 封装,选择你喜欢的语言进行调用封装即可,这样能够比直接进行调用,更简单、也更好维护程序逻辑。

好啦,到这里为止,我们了解了如何使用 API 的方式来访问 WordPress,接下来,我们来开始进阶使用。

保护你的 API 接口

我们分别来针对两种方案来聊聊 API 使用保护的问题。

WP CLI 的安全加固

这个方案的使用场景不论是 “管理员在 WP 安装环境敲命令行” 或者 “远程控制软件执行服务器命令”,都需要 “WordPress 安装环境” 正确安装和配置了 “WP CLI”,并且有权限执行命令。

所以,相对安全的方案策略就是:

  • 只在内部管理环境中进行 WP CLI 的安装,不在生产环境安装部署,确保 wp-config.php 能够访问要管理的数据库即可
  • 如果使用程序封装 WP CLI 为远程可调用命令,做好鉴权
  • 严格控制可执行 WP CLI 命令的用户权限,限制必要用户可访问执行
  • 如果是 SQLite 方案的 WordPress,则控制能够访问 WP 环境的用户即可

因为工具的使用有前置依赖,所以做安全策略的时候也就相对简单。

WP REST API 的安全加固

相比较 WP CLI,因为提供了 HTTP 访问,所以 WP REST API 的安全加固就相对麻烦一些。

不过,有一部分 WP CLI 的策略是可以借鉴的。

  • 比如,同样不在生产环境中进行配置,只在内部管理环境中进行配置,并提供内部应用来访问 API。
  • 在调用的过程中,做好身份鉴权,这里可以借助一些其他插件,比如 plugins/wp-rest-api-authentication/等。当然,默认的情况下,当你访问需要登录用户操作的动作时,也是要进行鉴权的 rest-api/using-the-rest-api/authentication/。
  • 或者借助网关、服务端 Web 软件来进行限制,比如 Traefik、Nginx ,比如这几篇文章:《Traefik 2 基础授权验证(前篇)》、《Traefik 2 基础授权验证(后篇)》、《使用容器搭建简单可靠的容器仓库》中提到的“切换使用 Nginx 提供仓库认证”甚至是 《编写 Nginx 模块进行 RSA 加解密》进行更高要求的鉴权。除此之外,还有限制调用频率、IP 访问白名单等等。

如果你是使用容器运行的 WordPress 实例的话,那么其实可以更简单一些,即不直接对外暴露端口,使用容器进行组网,来限制 WordPress 只能够被和他一起虚拟网络中的应用访问,来杜绝一些基础的风险。

提升你的服务性能

既然标题提到了 BaaS 化,那么少不了做为 API 服务被大量调用的场景,其实解决这个问题还是蛮简单的。

对于“读多写少”的场景,最简单的性能优化便是“加缓存”、“加机器(增加程序可用资源和程序进程、线程数)”、“静态化”。相关细节,很早之前在《第三届智源大会背后的那些事》的 “持续抗压”里提到过,就不展开了,都是老生常谈的话题。

当然,如果你没有使用前两篇内容中提到的 SQLite,还是使用了传统的关系型数据库,在当前固态硬盘遍地走的时代,哪怕购入一台 2C4G*2 低配置的支持高并发架构的云数据库(不贴链接了,避免被和谐,关键词“高并发架构”),支持的并发数量也能到 10万+。

除此之外,即便服务还有 CMS 属性,如果我们就是常规程序写入(包括采集)和调用(更新内容版本),做好批量写入队列,不去短时间(秒)内疯狂 JOIN 表查询或更新,想跑挂现在的数据库,还是挺困难的。

而如果你使用前两篇文章中提到的 SQLite 方案,相信你此时一定惊叹过了本地的 WordPress 原来可以这么快。以及在隐隐担忧使用这个方案做并发写入的时候,是否会有风险。

其实,在 2010 年的 SQLite 3.7.0 版本,官方就增加了 WAL 模式,用来支持并发写入。写这篇文章的时候,我正在筹划向官方提交一个新的 PR(#102),用来提供一个选项,支持 WAL 模式的激活,让这个方案下的 WordPress 写入性能变的更强。

最后

好啦,这篇文章里,我们聊完了 API 相关的问题,一款诞生和维护了 21 年的老牌软件摇身一变轻量的可 API 调用的 BaaS 服务。

下一篇相关的文章里,我们聊聊怎么和 AI 工具一起用它。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年04月22日
统计字数: 8811字
阅读时间: 18分钟阅读
本文链接: https://soulteary.com/2024/04/22/turn-wordpress-into-a-baas-service-a-guide-to-wp-api-calls.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/567393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用autocannon和0x对网站进行性能分析(node)

npm i autocannon -g autocannon -c 100 -d 5 -p 10 http://localhost:3000/ 0x -o app.js 火焰图是根据程序的栈的状态对出现函数的采样数据统计而得&#xff0c;宽度代表函数运行一次所需的时长、高度代表栈的层数、颜色深度代表函数在采样中出现的频率&#xff0c;因此宽度…

手摸手教你把Ingress Nginx集成进Skywalking

背景 在微服务大行其道的今天&#xff0c;如何观测众多微服务、快速理清服务间的依赖、如何对服务之间的调用性能进行衡量&#xff0c;成了摆在大家面前的难题。对此&#xff0c;Skywalking应运而生&#xff0c;它是托管在 Apache 基金会下的开源项目&#xff0c;旨在帮助开发…

vue element-ui 表格横向滚动条在合计项下方

目前效果 需求效果 1.隐藏bodyWrapper滚动条&#xff0c;显示footerWrapper滚动条 css代码如下&#xff1a; div ::v-deep .el-table--scrollable-x .el-table__body-wrapper{overflow-x: hidden!important;z-index: 2!important;} div ::v-deep .el-table__footer-wrapper …

git的安装与配置教程--超详细版

一、git的安装 1. 官网下载git git官网地址&#xff1a;https://git-scm.com/download/win/ 选择需要的版本进行下载 2、下载完成之后&#xff0c;双击下载好的exe文件进行安装。 3、默认是C盘&#xff0c;推荐修改一下路径&#xff0c;然后点击下一步 4、Git配置&#xff…

电子邮箱是什么?电子邮箱怎么申请注册?

虽然通过电子邮箱收发邮件办公已经成为常态&#xff0c;但是很多人不清楚电子邮箱是什么&#xff1f;电子邮箱是指通过网络传递的“邮局”&#xff0c;可以用来收发电子邮件。每个人的电子邮箱地址都是唯一的&#xff0c;确保他人的邮件能准确送到我们的电子邮箱之中。电子邮箱…

CRMEB pro版/多门店商城系统客服配置教程

客服功能配置介绍 功能提示&#xff1a; Pro v2.0系统采用swoole框架&#xff0c;客服不需要单独配置&#xff0c;按照正常安装流程配置好程序即可使用&#xff01; 如出现客服无法使用&#xff0c;请检查&#xff1a; 1.消息队列是否正常 2.重启swoole 一、功能介绍 CRMEB商城…

刷课必备!用Python实现网上自动做题

前言 开学少不了老师会布置一些 软件上面的作业&#xff0c;今天教大家用python制作自动答题脚本&#xff0c;100%准确率哦喜欢的同学记得关注、收藏哦 环境使用 Python3.8Pycharm 模块使用 import requests —> 数据请求模块 pip install requestsimport parsel —>…

GPU 之争:训练大模型的显卡规格大比拼

训练大模型有多烧钱&#xff1f;&#xff08;含常用GPU规格比较&#xff09; 训练大模型有多烧钱&#xff1f; 解锁大型语言模型的运行秘诀大型语言模型 (LLM) 对硬件要求很高&#xff0c;其中显卡内存至关重要。Meta 的 LLaMA 2 模型提供了规模不等的选项&#xff1a;* 70B 模…

C++/Qt 小知识记录5

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识5 Windows下查看端口占用情况C调用Python三方库测试库有没有被加上的测试方法初始化使用Python的env环境&#xff0c;用Py_SetPythonHome设置GDAL相关的&#xff0c;需要把osgeo、rasterio的路径加入…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

yolov8 区域声光报警+计数

yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的&#xff0c;具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points&#xff0c;当行人这一类别…

SpringBoot整合Swagger2

SpringBoot整合Swagger2 1.什么是Swagger2&#xff1f;&#xff08;应用场景&#xff09;2.项目中如何使用2.1 导入依赖2.2 编写配置类2.3 注解使用2.3.1 controller注解&#xff1a;2.3.2 方法注解2.3.3 实体类注解2.3.4 方法返回值注解2.3.5 忽略的方法 3.UI界面 1.什么是Swa…

FPGA组合逻辑电路设计之译码器

在数字电路中可以根据电路功能的不同分为&#xff0c;组合逻辑电路与时序逻辑电路。组合逻辑 电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入&#xff0c;与电路原来的状态无 关。而时序逻辑从电路特征上看来&#xff0c;其特点为任意时刻的输出不仅取决于该…

全网人气排行第一的免费开源ERP:Odoo电商功能应用亮点介绍

Odoo E-Commerce是一款创新型电子商务管理系统&#xff0c;旨在帮助企业建立以客户为中心的B2B与B2C电子商务平台&#xff0c;提高电商业务敏捷性&#xff0c;保障利润&#xff0c;并确保客户体验战略与时俱进。 —— 开源智造Odoo老杨 什么是Odoo免费开源电商管理系统&#xf…

Vue3引入高德地图js API 2.0

文章目录 前言一、地图加载1.本文准备环境2.引入库3.加载地图4.加载地图控件 二、POI搜索1.什么是poi搜索2.如何使用 三、绘制点标记与信息窗体1.场景描述2.案例3.信息窗体-链接路由跳转4.进阶-通过Marker自动触发标记点&#xff08;非鼠标手动点击&#xff09; 四、jsApi地图事…

文献速递:深度学习胶质瘤诊断---空间细胞结构预测胶质母细胞瘤的预后

Title 题目 Spatial cellular architecture predicts prognosis in glioblastoma 空间细胞结构预测胶质母细胞瘤的预后 01文献速递介绍 胶质母细胞瘤的治疗耐药性的关键驱动因素是肿瘤内的异质性和细胞状态的可塑性。在这里&#xff0c;我们调查了空间细胞组织与胶质母细胞瘤…

聚道云一键打通金蝶宁波银行,财务效率暴涨10倍!

客户介绍&#xff1a; 某农资有限公司是一家集农资贸易、仓储物流、农机服务为一体的大型企业。随着业务规模的不断扩大&#xff0c;传统的手动财务操作模式已难以满足其需求。公司急需寻找一种方法&#xff0c;将金蝶财务软件与宁波银行对接&#xff0c;实现资金流转自动化和…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

Ozone V3.32a Jlink显示变量波形

目录 前言 Ozone 配合Jlink显示变量波形 导出数组查看高频变量波形 总结 前言 Ozone V3.32a使用总结-CSDN博客 前面介绍了Ozone的安装和使用&#xff0c;因为调试需要&#xff0c;要看一些数据的波形。这里总结两种用Ozone查看变量波形的方法。 Ozone 配合Jlink显示变量波…