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

news2024/9/19 10:54:58

有了前面两篇内容的铺垫,我们来聊聊 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32H750时钟频率和功耗以及RTC功能测试

STM32H750时钟频率和功耗和RTC功能测试 ✨在使用STM32CubeMX修改STM32H750时钟树参数时&#xff0c;如果使用软件自动求解&#xff0c;这是一个非常耗时的操作&#xff0c;有时候还不一定成功&#xff0c;还是推荐使用手动方式进行配置&#xff0c;这一点和STM32其他系列不同&a…

叉车4G无线视频监控管理解决方案:提升效率,保障安全

在现代物流行业中&#xff0c;叉车被广泛应用于仓储和物流领域&#xff0c;成为提升效率和降低成本的重要工具。然而&#xff0c;叉车作为重要的运输设备&#xff0c;其安全性和管理效率也备受关注。针对这一问题&#xff0c;叉车4G无线视频监控管理解决方案应运而生。 叉车是仓…

RB-Tree

RB-tree 平衡二叉搜索树 元素排列规则有利于search 和 insert red-black tree(红黑树)是平衡二元搜索树(balanced binary tree)。其特征&#xff1a;排列规则有利于Search和Insert&#xff0c;并保持适度平衡—无任何节点过深。rb_tree提供两种插入操作:inset_unique和insert…

Rest微服务案例

Rest 父工程构建microservicecloud-api公共子模块Modulemicroservicecloud-provider-dept-8001部门微服务提供者Modulemicroservicecloud-consumer-dept-80部门微服务消费者Module 以Dept部门模块做一个微服务通用案例 Consumer消费者&#xff08;Client&#xff09;通过REST调…

HF区块链链码基础

链码生命周期 一 . 链码准备 准备文件 . 在测试目录下创建chaincode,拷贝测试链码进 chaincode目录,拷贝 set-env.sh 脚本进 scripts 目录 二. 打包链码 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.…

什么是信息熵?

什么是信息&#xff1f; ​ 我们在日常生活中吃瓜的时候总会说信息量太大了&#xff0c;那么这个信息是怎么个意思呢&#xff1f;我们在听到的时候很多原因都是因为这个消息是新鲜的&#xff0c;我们没见过的&#xff0c;没听说过&#xff0c;所以就说是信息量大。 信息熵 2…

重学java 22.面向对象 继承、抽象综合案例

我们纵横交错&#xff0c;最后回到原点 —— 24.4.23 综合案例 流程思维图 代码实现 方式1 利用set方法为属性赋值 父类&#xff1a; public abstract class Development extends Employee{}子类1&#xff1a; public class JavaEE extends Development{Overridepublic void w…

【软考高项】二十四、整合管理基础内容

一、概述内容 定义 项目整合管理包括识别、定义、组合、统一和协调项目管理过程组的各个过程和项目管理活动&#xff0c;项目整合管理贯穿项目始终。目标 ①资源分配;②平衡竞争性需求;③研究各种备选方法;④裁剪过程以实现项目目标;⑤管理各个项目管理知识领域之间的…

前端性能分析工具及使用

Lighthouse Lighthouse &#xff08;谷歌浏览器的插件商店中搜索并安装&#xff0c;浏览器中点击F12&#xff0c;开发者工具中可使用&#xff09;是 Google 开发的一款工具&#xff0c;用于分析网络应用和网页&#xff0c;收集现代性能指标并提供对开发人员最佳实践的意见。只要…

node.js版本降级/升级

第一步.先清空本地安装的node.js版本 按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 进入命令控制行窗口&#xff0c;输入where node&#xff0c;查看本地…

关于YOLO模型架构中的strides

在Ultralytics YOLO模型架构中&#xff0c;m.stride是一个非常关键的属性&#xff0c;用于描述网络在不同尺度&#xff08;scale&#xff09;上的空间压缩程度。解释m.stride的原理之前&#xff0c;我们首先要了解深度学习中卷积神经网络&#xff08;CNN&#xff09;的基本工作…

png图片如何缩小体积?这个方法效果不错

图片压缩是我们生活中经常都会遇到的问题。在日常工作中图片体积过大的话&#xff0c;在使用过程中就会收到影响&#xff0c;比如加载过慢等。那么&#xff0c;当我们想要对png图片进行压缩处理的时候&#xff0c;要怎么操作呢&#xff1f;很简单&#xff0c;使用图片在线压缩&…

【sping】在logback-spring.xml 获取项目名称

在日志文件中我们想根据spring.application.name 创建出的文件夹。 也不想死在XML文件中。 application.yml spring:application:name: my-demo logback-spring.xml <springProperty name"application_name" scope"context" source"spring.app…

如何用微信小程序实现远程控制无人售货柜

如何用微信小程序实现远程控制无人售货柜呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制无人售货柜&#xff0c;独立控制售货柜、格子柜的柜门。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi…

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg&#xff08;龙贝格&#xff09;算法 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 本专栏&#xff1a;数值分析复习 的前置知识主要有&#xff1a;数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

网络爬虫快速入门及爬取百度搜索结果(附源码)

前言 爬虫的基本结构及工作流程 1. 确定目标 首先&#xff0c;确定你想要爬取的目标&#xff0c;包括目标网站或网页、需要提取的数据类型&#xff08;如文本、图片、视频等&#xff09;以及爬取的深度&#xff08;单页、整个网站等&#xff09;。 2. 获取网页内容 使用HT…

为智算产业高质量发展探寻路径,又一重要生态合作启动

4月22日&#xff0c;由中国工业经济联合会主办的“2024中国工业经济高峰论坛智能算力产业高质量发展论坛”落幕。院士专家、研究机构、以及来自智能算力产业上下游企业代表近180人出席&#xff0c;围绕完善算力基础设施、深化算力赋能行业应用、推动区域数字化发展等热点议题展…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

大数据技术应用实训室解决方案

一、大数据课程体系 1.1 大数据实验实训课程体系设计依据 大数据实验实训课程体系的设计依据主要围绕培养目标、培养方案和课程体系建设三个方面来展开。 1、培养目标 大数据实验实训课程的设计旨在培养具备大数据理论知识和实践技能的专业人才。具体而言&#xff0c;这些人才…

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

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