大规模远程控制 WordPress

Avatar of Scott Fennell
Scott Fennell

DigitalOcean 为您的旅程各个阶段提供云产品。立即开始使用 $200 免费信用!

这是“远程控制 WordPress”系列文章中的第三篇,也是最后一篇。这是我对这种管理“控制”安装中的网络设置,然后将这些值提取到所有客户端安装中的策略的昵称。其优势在于它可以节省工作人员在多个多站点安装中切换相同设置上的相同网络插件的时间。

文章系列

第一部分:用于远程控制 WordPress 的 WP REST API
第二部分:OAuth 与 OAuth1 的乐趣
第三部分:大规模远程控制 WordPress(您现在所处位置!)

第一篇文章 中,我演示了如何通过 WP API 公开网络设置以进行查询。在 第二篇文章 中,我演示了如何查询这些设置,即使它们需要 OAuth 标头(它们始终应该如此)。在这篇文章中,我将把所有部分整合在一起,向您展示我在生产中是如何使用它的。

您需要进行操作的步骤

如果您熟悉该系列文章,您就知道我们需要两个 WordPress 多站点安装才能实现这一点。

  • 首先,我们需要控制安装,我们将在其中管理设置。我在这些演示中使用我的个人网站作为控制安装。
  • 其次,我们需要一个客户端安装来从控制安装中查询设置。我正在使用我的本地 MAMP 完成此操作。

就像上一篇文章一样,控制安装应该具有 WP REST API V2 插件 以及我的 CSS-Tricks WP API Control 插件 网络激活。这些插件在之前的文章中进行了分析,不过现在值得重新获取控制插件,因为我最近修复了一个 PHP 警告。

部分新领域:控制安装和客户端安装都应该具有我的 CSS-Tricks WP API 客户端 插件网络激活和 填空。该过程在第二篇文章中针对客户端安装进行了描述。现在,将您填写的该插件版本复制到控制安装中;无需为控制安装重新执行 OAuth 繁琐的操作。

也是部分新领域:现在,您已经完成了第二篇文章中的步骤,您可以继续从控制安装中卸载 OAuth1 插件

全新的领域:控制安装和客户端都需要一个功能插件来演示如何在有意义的情况下使用 CSS-Tricks WP API 客户端。我已经为您准备了这样一个功能插件,名为 CSS-Tricks Can He Loginz?

都准备好了吗?很好。我们即将开始……抽象

抽象层

本系列文章中的内容已经变得有点复杂。在第二篇文章中,我们做了大量工作,以便从控制博客中查询网络设置。我们通过一个演示短代码来完成此操作,该短代码只是记录 API 调用的结果。在现实生活中,我运行了许多“功能”插件来执行诸如 Google Analytics、管理员通知、白标等操作,您说出名字,它都会做。如果我们想通过远程控制来管理所有这些功能插件的设置,如果我们将所有 API 工作都复制/粘贴到每个插件中,那将非常麻烦。因此,我们需要一个插件,它可以为我们提供一个框架,用于从控制安装中获取网络选项,并且所有功能插件都可以使用该框架。我们需要一个抽象层!

维基百科 告诉我们:

在软件工程和计算机科学中,抽象是用于管理计算机系统复杂性的技术。

这正是我在我的 CSS-Tricks WP API 客户端插件中所做的。只需浏览文件列表,您就会了解我要用它做什么。

  1. `control_panel.php` 在 `wp-admin/network/` 中呈现网络设置 UI,我们的功能插件将实例化它。它有一些细微差别对这篇文章至关重要,我将在下面详细介绍。
  2. `remote.php` 调用控制安装来查询给定的网络设置。它将远程设置与本地设置合并,以便实际将完整的设置清单传递给功能插件以供其使用。
  3. `crud.php` 获取和设置网络选项。如果您对 缺乏核心网络管理员 API 感到困扰,可以打开此文件并考虑对此感到兴奋。它在这篇文章中只发挥着很小的作用。
  4. `oauth.php` 对控制安装进行身份验证。它在这里使用,但未进行讨论。我们上一篇文章中已经分析过它。
  5. `demo.php` 为整个过程提供了一个入门级的短代码,我们在上一篇文章中已经介绍过。我们这里既不讨论也不使用它。

这个插件单独使用绝对不会做任何事,这很好。功能插件将使用它来创建、查看、更新或删除网络设置,包括在控制安装中管理的设置。

明确地说,即使我们没有进行所有这些远程控制操作,CSS-Tricks WP API 客户端插件也仍然非常酷:它的一部分价值在于它为我们在整个代码库中执行网络设置页面提供了一个一致的框架,这本身就很棒。

我将在后面深入探讨 CSS-Tricks WP API 客户端插件的相关部分。现在,我想介绍一下我们将使用抽象层的功能插件。

就是它了

美国创作型歌手肯尼·罗金斯的照片

我们的功能插件 CSS-Tricks Can He Loginz 只做一件事,而且它做得很好:它在 wp-login 页面上添加了美国创作型歌手肯尼·罗金斯的照片。Can He Loginz 插件 要求 API 客户端插件也必须处于活动状态。

功能插件处于活动状态,但抽象插件没有。

它包含两个网络选项,其中一个在控制博客上管理,另一个在每个客户端安装上管理,仅用于演示两种情况。这是一个重要的点:给定插件可能具有许多设置,其中一些设置在所有客户端安装中都相同,而另一些设置则不同。我们的功能插件中包含了每种设置。

功能插件的设置页面。

这个例子显然是荒谬的(如果您不知道肯尼·罗金斯是谁,别担心。只需要知道他的音乐在现在的讽刺意义上非常棒,并且插件设置与他的某些歌词有关),但是这个功能插件与 CSS-Tricks WP API 客户端的集成方式非常酷。查看 这段代码,它将我们的功能插件注册到抽象层中。完成。Can He Loginz 插件现在在网络管理中有一个设置页面,具有远程控制功能。

我要强调的是:在完成了本系列文章中我们已经接受并执行的设置任务之后,实现功能插件的远程控制 WordPress 基本上只需要一行代码

这些设置虽然很傻,但它们是在这里 数组 中定义的。我们可以很容易地在其中添加、删除或重新定义设置。

现在,要查看 Can He Loginz 插件实际上是如何使用这些设置的,请打开一个新的浏览器并查看登录页面。

功能插件修改后的登录页面。

正如承诺的那样,它显示了我们的照片,并在几个文本块中使用了我们的选项。

哇……

对吧?

问题的关键在于我这里名为 merge() 的函数,它来自我调用控制安装的类。首先,它会获取您的客户端设置 - 这些设置是您希望能够在每个博客上自定义的设置。在我们这个例子中,就是“鞋子”复选框。接下来,它会遍历控制安装上的所有远程设置,比如我们示例中的“危险区”设置,并将它们也添加到输出中。最终结果就像是在您的客户端和控制端分别调用 get_site_option() 并合并结果一样 - 事实上,幕后正是通过 WP API 完成的。

为了帮助说明这一点,请注意控制端和客户端显示设置 UI 之间的细微差别。

左边是客户端,右边是控制端。

在两个屏幕中,第一个设置都是远程控制设置,因此从客户端安装查看时,它是禁用的。相同的设置在控制端是启用的。相反,由于第二个设置恰好在每个客户端安装上都期望不同的值,因此它在客户端上是启用的,在控制端是禁用的。这种逻辑发生在 这里,在我的绘制控制面板 UI 的类中。

还需要注意的是缓存。客户端 缓存 控制端的结果,并且它有能力通过重新保存客户端 UI 中的设置来 清除缓存

这里鸡蛋篮子比率是多少?

在系列第一篇文章的评论区,MF Simchock 表示担心,如果控制安装出现宕机,那么所有客户端安装都将无法调用其设置。虽然这是事实,但我们可以做一些事情来缓解这个问题。其中一些事情超出了本系列的范围。

  • 无论您需要做什么,都要阻止网络流量访问控制安装。它只有一种用途:为客户端安装设置和提供网络选项。将该服务器配置为这种方式。我对这方面并不熟悉,但我不知道是否有便捷的方式通过 IP 地址进行白名单,您可以在其中维护一个您的客户端安装服务器 IP 地址列表,并检查所有请求是否都来自该列表。
  • 如果您的控制安装与您的客户端安装位于同一台机器上,那么控制安装的宕机也可能导致您的客户端安装宕机。像 CloudFlare 的 Always Online 这样的服务可以帮助解决这种情况。

我们可以在代码库中做的是,永远不要缓存看起来有问题的结果。看看 这段代码,它会检查控制端发来的 HTTP 响应,如果响应是 40x 或 50x,则不会缓存结果。

WP-CLI 怎么样?

在第一篇文章中,评论者“cidas” 建议 我们可以通过 WP-CLI 更容易地实现远程控制 WordPress。他并没有错。我们绝对可以编写一个 CLI 脚本,用于在客户端和控制端之间 推送或拉取设置。这不是我能写的内容,我还没有计划在生产环境中使用它。原因有几点。

  1. 它恰好比 API/插件领域更超出了我的技能范围。
  2. 如果我们把命令行技能作为我们设置管理人员的招聘/培训先决条件,这将对我们的商业模式产生重大影响。这可能是好的影响,也可能是坏的影响。目前,我不想有任何影响!
  3. 我认为 CLI 解决方案更适合控制端将数据推送到客户端安装,而不是客户端从控制端拉取数据。这让我感到害怕,因为有问题的脚本可能会破坏实时客户端数据。

下一步

对这项工作来说,最可能发生的事情是 WP API 与 OAuth1 插件一起完全合并到核心代码库中。如果您开始远程控制的生活方式,请关注这些项目的更新。

除此之外,我不打算让它比必要时更花哨或更复杂:我认为它已经准备好了。下一步是继续在更大、流量更大、更重要的项目中实施它,并继续消除任何粗糙的边缘。

当然,您可以对其进行单元测试,我在这篇文章中没有详细介绍。您也可以添加对更多字段类型的支持(颜色选择器、日期时间选择器等等)。我想你也可以让它更漂亮。我为设置页面准备了完全零 CSS,我认为这是一件好事。

我本来以为第三篇文章会是系列中最长、最复杂的一篇,但实际上并没有什么内容。毕竟,我们的功能插件只需少量代码就能加入远程控制的生活方式,这些代码都是低复杂度的,只需要声明 一个 slug设置。感觉这是一种非常奇怪且过于复杂的方法来获得网络设置,但我认为它远胜于在许多安装中多次处理相同的设置。我准备全力以赴地采用这种模式,并且希望将其做得更好。如果您尝试操作它,我很想听听遇到的难点。

文章系列

第一部分:用于远程控制 WordPress 的 WP REST API
第二部分:OAuth 与 OAuth1 的乐趣
第三部分:大规模远程控制 WordPress(您现在所处位置!)