探索用于 Web 应用程序开发的 WordPress 功能:解锁 URL 重写功能

wufei123 2024-06-02 阅读:15 评论:0
现代 web 应用程序开发框架最好的一点是,它们提供了一种生成真正干净的路由(或 url 方案)的方法,这些路由或 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 的帖子”。

如果您深入查看固定链接设置屏幕上的选项,您还会看到各种选项:

探索用于 Web 应用程序开发的 WordPress 功能:解锁 URL 重写功能

您可能会看到的重写规则的另一个示例是所谓的“漂亮的永久链接”,或者如 WordPress 仪表板中所命名的“帖子名称”。

在此格式中,URL 如下所示:

http://domain.com/post-title/

从这里开始,请求的 URL 进入 Web 服务器,然后根据一组规则确定具有该标题的帖子的 ID,并将其返回给请求客户端(即浏览器)。

在这两个示例之间,有一个基本原则在起作用,它准确地演示了重写规则是什么。

简而言之,重写规则定义了一组规则,其中传入的 URL 被转换为客户端从数据库检索信息的格式。

当然,这提出了两个问题:

  • 重写规则是如何生成的?
  • 也许更重要的是,为什么它们如此复杂?
  • 重写规则的业务

    重写规则对开发人员来说是一个挑战,因为它们基于正则表达式。 Jamie Zawinski 有一句关于正则表达式的老话:

    有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

    有趣,但却是事实。这就是为什么在 WordPress 中处理自定义重写规则对于许多开发人员来说是一个挑战。

    不幸的是,我们无法演示重写规则可以创建或支持的 URL 架构的每种变体或类型,但我们可以看几个实际示例,这些示例展示了如何开始并提供基础或指导我们在未来的应用程序工作中需要做什么。

    刷新重写规则

    需要注意的一件事是,当您定义重写规则时,它们不会立即生效 - 它们已经被刷新。这意味着您需要删除旧的规则集,并将其替换为新的规则集。

    有两种方法可以实现此目的:

  • 您可以在固定链接设置仪表板中点击保存更改。尽管事实上会选择一个选项,但您在应用程序的 functions.php 文件中定义的任何内容都将被使用。
  • 您可以调用 $wp_rewrite->flush_rules(); 并以编程方式解决该问题。
  • 无论您选择哪种路线,记住此步骤都很重要,因为每次定义新的重写规则时,您都需要刷新旧规则。

    重写 API 如何工作?

    当实际编写我们自己的重写规则时,了解重写 API 的工作原理非常重要。

    它可以归纳为四个步骤:

  • 从网络服务器请求 URL。
  • 如果请求的网址存在内容,则将返回该内容(可以是图像、字体或其他内容)。
  • 如果内容不存在,则请求将被定向到 index.php,它将与网址的模式匹配。
  • 内容随后将从 WordPress 返回到请求客户端。
  • 如果您有兴趣根据固定链接仪表板中的配置查看重写规则的定义,请查看重写规则检查器插件。

    此插件将呈现当前用于匹配指定 URL 模式的所有规则的列表,包括正则表达式和针对 index.php 的匹配变量。

    探索用于 Web 应用程序开发的 WordPress 功能:解锁 URL 重写功能

    有道理吗?如果没有,让我们看几个简单实用的示例。

    重写规则的示例

    鉴于我们知道模式将被匹配并传递到 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 <code>wp_redirect</code> 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 <code>wp_redirect</code> 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 重写功能的详细内容,更多请关注知识资源分享宝库其它相关文章!

    版权声明

    本站内容来源于互联网搬运,
    仅限用于小范围内传播学习,请在下载后24小时内删除,
    如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
    E-mail:dpw1001@163.com

    分享:

    扫一扫在手机阅读、分享本文

    发表评论
    热门文章
    • 华为 Mate 70 性能重回第一梯队 iPhone 16 最后一块遮羞布被掀

      华为 Mate 70 性能重回第一梯队 iPhone 16 最后一块遮羞布被掀
      华为 mate 70 或将首发麒麟新款处理器,并将此前有博主爆料其性能跑分将突破110万,这意味着 mate 70 性能将重新夺回第一梯队。也因此,苹果 iphone 16 唯一能有一战之力的性能,也要被 mate 70 拉近不少了。 据悉,华为 Mate 70 性能会大幅提升,并且销量相比 Mate 60 预计增长40% - 50%,且备货充足。如果 iPhone 16 发售日期与 Mate 70 重合,销量很可能被瞬间抢购。 不过,iPhone 16 还有一个阵地暂时难...
    • 酷凛 ID-COOLING 推出霜界 240/360 一体水冷散热器,239/279 元

      酷凛 ID-COOLING 推出霜界 240/360 一体水冷散热器,239/279 元
      本站 5 月 16 日消息,酷凛 id-cooling 近日推出霜界 240/360 一体式水冷散热器,采用黑色无光低调设计,分别定价 239/279 元。 本站整理霜界 240/360 散热器规格如下: 酷凛宣称这两款水冷散热器搭载“自研新 V7 水泵”,采用三相六极马达和改进的铜底方案,缩短了水流路径,相较上代水泵进一步提升解热能力。 霜界 240/360 散热器的水泵为定速 2800 RPM 设计,噪声 28db (A)。 两款一体式水冷散热器采用 27mm 厚冷排,...
    • 惠普新款战 99 笔记本 5 月 20 日开售:酷睿 Ultra / 锐龙 8040,4999 元起

      惠普新款战 99 笔记本 5 月 20 日开售:酷睿 Ultra / 锐龙 8040,4999 元起
      本站 5 月 14 日消息,继上线官网后,新款惠普战 99 商用笔记本现已上架,搭载酷睿 ultra / 锐龙 8040处理器,最高可选英伟达rtx 3000 ada 独立显卡,售价 4999 元起。 战 99 锐龙版 R7-8845HS / 16GB / 1TB:4999 元 R7-8845HS / 32GB / 1TB:5299 元 R7-8845HS / RTX 4050 / 32GB / 1TB:7299 元 R7 Pro-8845HS / RTX 2000 Ada...
    • python中def什么意思

      python中def什么意思
      python 中,def 关键字用于定义函数,这些函数是代码块,执行特定任务。函数语法为 def (参数列表)。函数可以通过其名字和圆括号调用。函数可以接受参数作为输入,并在函数体中使用参数名访问。函数可以使用 return 语句返回一个值,它将成为函数调用的结果。 Python 中 def 关键字 在 Python 中,def 关键字用于定义函数。函数是代码块,旨在执行特定任务。 语法 def 函数定义的语法如下: def (参数列表): # 函数体 示例 定义...
    • python中int函数的用法

      python中int函数的用法
      int() 函数将值转换为整数,支持多种类型(字符串、字节、浮点数),默认进制为 10。可以指定进制数范围在 2-36。int() 返回 int 类型的转换结果,丢弃小数点。例如,将字符串 "42" 转换为整数为 42,将浮点数 3.14 转换为整数为 3。 Python 中的 int() 函数 int() 函数用于将各种类型的值转换为整数。它接受任何可以解释为整数的值作为输入,包括字符串、字节、浮点数和十六进制表示。 用法 int(object, base=10) 其中...