### [探索用于 Web 应用程序开发的 WordPress 功能:解锁 URL 重写功能](https://www.prosaas.cn/article/2423) **Published:** 2023-09-04T12:09:14 **Author:** 5201314 **Excerpt:** 现代 Web 应用程序开发框架最好的一点是,它们提供了一种生成真正干净的路由(或 URL 方案)的方法,这些路… 现代 Web 应用程序开发框架最好的一点是,它们提供了一种生成真正干净的路由(或 URL 方案)的方法,这些路由或 URL 方案映射到应用程序结构的概念模型。 例如,给定某种类型的数据(例如**个人**),您可以执行以下操作: - 添加 - 更新 - 删除 等等。 根据您的应用程序的性质,您可能可以执行更多操作(例如添加配偶),但就本文而言,基本的 CRUD 操作足以证明这一点。 对于那些一直关注的人,我们一直在研究 WordPress 提供的作为应用程序开发基础的各种功能。在继续讨论时,我们有必要了解一下可用于自定义 WordPress 重写规则的 API。 普通用户可能熟悉如何更改 WordPress 仪表板中的 URL 架构(我们将简要讨论这一点,以确保我们都在同一页面上),但是,对于那些需要更改 URL 架构的用户来说,还有更多功能可供使用。了解 WordPress 中的 URL 重写。 事实上,我们有能力构建 URL 重写规则来匹配和执行,就像现代基于 MVC 的框架一样。 * * * ## 了解重写规则 为了确保我们都在同一页面上,可以将重写规则视为将特定模式与网络服务器进行匹配以从数据库检索数据的方式。 例如,在标准 WordPress 安装中,默认的永久链接结构如下: http://domain.com/?p=123 此 URL 包含一个查询字符串参数,即 `p=123` 的键值对,在 WordPress 上下文中,它表示“检索 ID 为 123 的帖子”。 如果您深入查看**固定链接设置**屏幕上的选项,您还会看到各种选项: ![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212120856995.png) 您可能会看到的重写规则的另一个示例是所谓的“漂亮的永久链接”,或者如 WordPress 仪表板中所命名的“帖子名称”。 在此格式中,URL 如下所示: http://domain.com/post-title/ 从这里开始,请求的 URL 进入 Web 服务器,然后根据一组规则确定具有该标题的帖子的 ID,并将其返回给请求客户端(即浏览器)。 在这两个示例之间,有一个基本原则在起作用,它准确地演示了重写规则是什么。 简而言之,重写规则定义了一组规则,其中传入的 URL 被转换为客户端从数据库检索信息的格式。 当然,这提出了两个问题: 1. 重写规则是如何生成的? 2. 也许更重要的是,为什么它们如此复杂? * * * ## 重写规则的业务 重写规则对开发人员来说是一个挑战,因为它们基于正则表达式。 Jamie Zawinski 有一句关于正则表达式的老话: > 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 有趣,但却是事实。这就是为什么在 WordPress 中处理自定义重写规则对于许多开发人员来说是一个挑战。 不幸的是,我们无法演示重写规则可以创建或支持的 URL 架构的每种变体或类型,但我们可以看几个实际示例,这些示例展示了如何开始并提供基础或指导我们在未来的应用程序工作中需要做什么。 ### 刷新重写规则 需要注意的一件事是,当您定义重写规则时,它们不会立即生效 - 它们已经被刷新。这意味着您需要删除旧的规则集,并将其替换为新的规则集。 有两种方法可以实现此目的: 1. 您可以在**固定链接设置**仪表板中点击**保存更改**。尽管事实上会选择一个选项,但您在应用程序的 `functions.php` 文件中定义的任何内容都将被使用。 2. 您可以调用 `$wp_rewrite->flush_rules();` 并以编程方式解决该问题。 无论您选择哪种路线,记住此步骤都很重要,因为每次定义新的重写规则时,您都需要刷新旧规则。 ### 重写 API 如何工作? 当实际编写我们自己的重写规则时,了解重写 API 的工作原理非常重要。 它可以归纳为四个步骤: 1. 从网络服务器请求 URL。 2. 如果请求的网址存在内容,则将返回该内容(可以是图像、字体或其他内容)。 3. 如果内容不存在,则请求将被定向到 `index.php`,它将与网址的模式匹配。 4. 内容随后将从 WordPress 返回到请求客户端。 如果您有兴趣根据**固定链接**仪表板中的配置查看重写规则的定义,请查看重写规则检查器插件。 此插件将呈现当前用于匹配指定 URL 模式的所有规则的列表,包括正则表达式和针对 `index.php` 的匹配变量。 ![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212120856582.png) 有道理吗?如果没有,让我们看几个简单实用的示例。 ## 重写规则的示例 鉴于我们知道模式将被匹配并传递到 `index.php`,我们可以利用 `add_rewrite_rule` 函数来定义自定义 URL 的工作方式。 ### 帖子 ID 的简短标题 假设我们正在查看系统中的第一篇帖子,即 ID 为 1 的帖子。 在大多数普通 WordPress 安装中,这是**Hello World**,URL 通常为 `http://domain.com/hello-world` 或 `http://domain.com/? p=1` 取决于您的永久链接设置(即您当前的重写规则集)。 但是让我们定义一个规则,以便 `http://domain.com/first` 也将加载数据库中的第一篇文章: function example\_add\_rewrite\_rules() { add\_rewrite\_rule( 'first', 'index.php?p=1', 'top' ); flush\_rewrite\_rules(); } add\_action( 'init', 'example\_add\_rewrite\_rules' ); 让我们再添加一条规则,该规则将允许我们在数据库中加载第二篇文章。即 `http://domain.com/?p=2`。 function example\_add\_rewrite\_rules() { add\_rewrite\_rule( 'first', 'index.php?p=1', 'top' ); add\_rewrite\_rule( 'second', 'index.php?p=2', 'top' ); flush\_rewrite\_rules(); } add\_action( 'init', 'example\_add\_rewrite\_rules' ); 假设您已经阅读了 `add_rewrite 规则` 的文档,这很容易理解,对吧? 简而言之,它接受三个参数: - 第一个参数是与请求的 URL 匹配的正则表达式。在我们的例子中,我们使用简单的单词。 - 第二个参数是实际获取的 URL。同样,在我们的例子中,我们分别检索第一篇和第二篇帖子。 - 最后,最后一个参数是优先级,可以是“top”或“bottom”。如果设置为“top”,则该规则将优先于所有其他规则进行评估;但是,如果为“bottom”,则将最后评估。 现在,这些示例都是基本的。这还不足以真正向我们展示如何设置自定义路由,例如我们在本文前面概述的路由。为此,我们需要看一些更复杂的表达式。 ### 导入有关刷新重写规则的注释 但在我们开始这样做之前,需要注意的是,像我们上面所做的那样调用 `flush_rewrite_rules()` 实际上是一种**不好的做法**。它在上面的示例中有效,但实际上会减慢网站的加载时间。 事实上,它实际上只需要在重写规则发生变化时调用。每当激活插件时都可能会发生这种情况,或者当激活主题时它可能会发生变化。 无论如何,请确保正确挂钩函数,以便重写规则不会在每次加载页面时刷新 - 只要重写规则本身发生更改。 * * * ## 重写规则的更复杂方法 为了引入一组更复杂的重写规则,例如我们在本文前面通过 CRUD 操作详细介绍的重写规则,了解以下两个函数非常重要: - `add_rewrite_tag` 会让 WordPress 了解自定义查询字符串变量。这也与下一个函数结合使用。 - `add_rewrite_rule,` 如前所述,将允许我们向 WordPress 添加额外的重写规则(以及设置它们的优先级)。 现在假设我们有一个名为**个人**的自定义帖子类型,它代表应用程序中的某个人。然后,假设**个人**还具有以下方法和相应的可用网址: - `all`: `http://domain.com/individuals/` - `update`: `http://domain.com/individual/update/1` 用于更新第一人称 - `delete`: `http://domain.com/individual/delete/1` 用于删除第一个人 所以这个模式很简单,但是我们如何实现它呢? 首先,我们需要定义重写规则: function example\_add\_rewrite\_rules() { // Define the tag for the individual ID add\_rewrite\_tag( '%individual\_id%', '(\[0-9\]\*)' ); // Define the rules for each of the individuals add\_rewrite\_rule( '^individual/update/(\[0-9\]\*)', 'index.php?individual=update&individual\_id=$matches\[1\]', 'top' ); add\_rewrite\_rule( '^individual/delete/(\[0-9\]\*)', 'index.php?individual=delete&individual\_id=$matches\[1\]', 'top' ); } add\_action( 'init', 'example\_add\_rewrite\_rules' ); 接下来,我们需要为每个人定义这些自定义函数,以便它们在调用时更新数据库中的正确记录。 在本例中,我们将定义两个函数 - 一个用于更新**个人**,另一个用于删除**个人**。以下代码还假设从浏览器提交的表单中将包含一些信息。 具体来说,它假设将发送个人 ID、名字、姓氏和其他信息,以便更新个人。 function example\_process\_individual( $input ) { if ( example\_updating\_user() ) { example\_update\_individual( $input ); } else if ( 'true' == $input\['delete\_individual'\] ) { example\_delete\_individual( $input\['individual\_id'\] ); } } if( ! is\_admin() ) add\_action( 'init', 'example\_process\_individual' ); function example\_update\_individual( $input ) { /\* The incoming $input collection from an assumed form \* that will be used to update the user. \* \* It may include information such as the ID, the first name, \* last name, and so on. \* \* Upon success, use wp\_redirect to go back to the homepage, or reload \* the page to show an error. \*/ } function example\_delete\_individual( $individual\_id ) { /\* Use the incoming ID to locate the individual record and remove it \* from the database. \* \* Upon success, use wp\_redirect to go back to the homepage, or reload \* the page to show an error. \*/ } function example\_updating\_user() { return 0 == strpos( $\_SERVER\['REQUEST\_URI'\], '/individual/update' ); } function example\_deleting\_user() { return 0 == strpos( $\_SERVER\['REQUEST\_URI'\], '/individual/delete' ); } 请注意,上面的第一个函数已挂接到 `init` 操作中,并且_仅_在用户未以管理员身份登录时触发。此外,还可以通过有条件地将其设置为仅在来自某个页面时加载来进一步增强此功能;然而,对于这个例子来说,它达到了它的目的。 接下来,阅读 `Update` 和 `Delete` 函数的代码注释,了解它们应如何运行。 最后,请注意,最后两个函数是简单的帮助程序,旨在允许我们在初始挂钩函数中编写更清晰的代码。 ### 有点不完整 我知道,这是一个不完整的示例,但对于一篇冗长的文章和一个复杂的主题,我的目标是尽我所能来展示 WordPress Rewrite API,讨论使用它的优点,并讨论如何使用它来创建更清晰的 URL 路由。 事实是,这仍然是一个具有挑战性的主题,并且最好通过实施来掌握。尽管如此,这是 WordPress 应用程序的另一个组件,使其可以作为 Web 应用程序开发的基础。 * * * ## 下一个 说了这么多,现在是时候讨论**缓存**的概念了。 当然,有很多可用于 WordPress 的缓存插件,但如果您是开发人员,您希望构建一定程度的本机缓存,并且您希望利用 WordPress API 来实现所以。如果是这种情况,熟悉可用的内容以及如何操作就很重要。 话虽如此,我们接下来将注意力转向 **Transients API**,以便我们可以自己处理一些本机缓存,并回顾这如何帮助第三方缓存机制使我们的应用程序更快。 以上就是探索用于 Web 应用程序开发的 WordPress 功能:解锁 URL 重写功能的详细内容,更多请关注知企PROSAAS其它相关文章! **Tags:** delete, http, mvc, php, WordPress, 子类, 字符串, 数据库, 架构, 正则表达式 **Categories:** WordPress ---