从 WordPress 4.7(2016 年 12 月)开始,WordPress 就内置了一个 JSON API。想看看吗?点击这里 CSS-Tricks 上的这个 URL。它有 大量的文档。
该 JSON API 可用于各种用途。我认为 API 通常被认为是用于外部使用,例如将数据提供给其他网站。但同样有趣的是考虑在网站本身处理该 API。如今,许多网站都是这样构建的,使用了“现代 JavaScript”等等。
因此,可以构建一个 WordPress 主题,该主题使用其自己的 API 获取所有数据,从而创建一个完全客户端渲染的网站。
我原以为会有很多这样的主题可用,但似乎这个概念还比较新,所以并没有那么多。至少我找到的不多。不过,我确实找到了 Foxhound,由 Kelly Dwan 开发。它简洁美观。

它是基于 React 的,所以整个主题在逻辑上被分解成多个组件。

我将其部署到一个测试网站上,并且运行良好!为了能够点击四处操作,我导入了 “主题单元测试”数据,这是一种快速便捷的方式,可以将一堆典型的内容(文章、作者、评论等)填充到新的 WordPress 安装中,用于测试目的。
看起来只有页面的框架是服务器端渲染的。如果没有 JavaScript,您将一无所获。当然,您可以按照常规的服务器端渲染 WordPress 方式让所有这些工作,但您将重复大量工作,因此这里没有这样做也就不足为奇了。我认为您更有可能尝试服务器端渲染 React,而不是使 PHP 和 React 代码保持同步。
您点击的 URL 中大约有 50% 可以立即加载,就像您在 SPA 类型网站中预期的那样。看起来 PHP 渲染的框架页面中生成的任何链接都会刷新,而 React 组件中渲染的链接则以 SPA 方式加载。
我认为,如果您有兴趣构建一个 React 驱动的 WordPress 网站,这将是一个非常强大的基础。这在如今确实是一个趋势。我碰巧正在查看 Human Made 网站,他们表示他们为 ustwo 这样做了。
ustwo 希望构建一个解耦的网站,使用 WordPress 后端和 React 前端。Human Made 加入开发团队来构建 WordPress 组件,包括自定义帖子类型和自定义 REST API,以提供结构化数据供前端显示。
所以,你知道,如今人们正在为这种工作付费。
“但同样有趣的是考虑在网站本身处理该 API。”
我以前做过这个。在我的案例中,服务器从其自己的 API 获取数据并将其直接传递到视图,因此它不是 JavaScript 渲染的视图,但大多数人会通过 API 而不是前端与网站交互,因此它非常适合确保我的 API 易于使用且没有错误。
这很酷,但这样不会将我所有的文章都暴露给任何想要获取它们的人,并以一个简洁的小包的形式呈现吗?我访问了我们公司的 WP 网站,并在后面附加了 /wp-json/wp/v2/posts,它将每篇文章都以 JSON 格式输出,没有任何身份验证或其他任何东西。对于博客来说这可能没问题,但对于有竞争对手的企业来说,这可能是个问题。
嘿,Brian,实际上,很多信息已经通过任何 WordPress 网站上的 RSS 暴露了(除非您专门禁用了它)。
有关 RSS 示例,请查看 CSS Tricks 本身
https://css-tricks.org.cn/feed/?post_type=posts
这是 WP REST API 等效项
https://css-tricks.org.cn/wp-json/wp/v2/posts
它们都开箱即用,但可以通过一些挂钩和过滤器(或可能为您执行此操作的插件)进行锁定。
我也这么想,并做了一些研究。开箱即用,WordPress 会公开所有文章,但您可以轻松添加身份验证:https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/
我只是觉得遗憾的是,他们没有原生包含 OAuth 身份验证,而只包含 Cookie 身份验证。但插件可以为此提供帮助。
我最近一直在大量使用 WordPress API 来添加建议的搜索结果,当用户在搜索框中键入内容时。如果您在一个帖子类型中搜索,则只需在 API 请求中添加
?s=
参数即可。如果您需要跨多个帖子类型搜索,则可以创建自定义端点。这很有趣!我有点担心访问 ACF 或 WPML 等插件中的内容……我非常依赖它们(以及围绕解决方案进行大量谷歌搜索)。
至少对于 ACF,我知道一个解决方案:https://br.wordpress.org/plugins/acf-to-rest-api/
嘿,Wolfr,通常没有理由担心。默认情况下,使用您提到的插件不会将任何敏感信息暴露给 REST API(取决于您对敏感信息的定义)。
您必须使用
register_rest_field
等函数有意公开其他信息。文档:https://developer.wordpress.org/reference/functions/register_rest_field/
有时我会使用类似 https://wordpress.org/plugins/acf-to-rest-api/ 的东西有意公开所有 acf 字段。
总而言之,据我所知,REST API 通常不会暴露 RSS 尚未暴露的任何内容。
有一些插件可以完全禁用它或使用它。
从技术上讲,您不能将前端与后端分离,然后仍然使用 PHP 进行前端吗?API 中没有任何内容要求请求来自浏览器中的 JS,对吧?
我只是提到这一点作为一种简化学习曲线的方法。
API 不要求您通过 JS 发出请求,对于 PHP,您可以使用类似 CURL 的东西。