現代 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 的貼文」。
如果您深入查看固定連結設定畫面上的選項,您還會看到各種選項:
#您可能會看到的重寫規則的另一個範例是所謂的“漂亮的永久連結”,或者如 WordPress 儀表板中所命名的“文章名稱”。
在此格式中,URL 如下所示:
http://domain.com/post-title/
從這裡開始,請求的 URL 進入 Web 伺服器,然後根據一組規則確定具有該標題的貼文的 ID,並將其傳回給請求用戶端(即瀏覽器)。 p>
在這兩個範例之間,有一個基本原則在起作用,它準確地演示了重寫規則是什麼。
簡而言之,重寫規則定義了一組規則,其中傳入的 URL 被轉換為客戶端從資料庫檢索資訊的格式。
當然,這提出了兩個問題:
重寫規則對開發人員來說是一個挑戰,因為它們是基於正規表示式。 Jamie Zawinski 有一句關於正規表示式的老話:
有些人在遇到問題時會想「我知道,我會使用正規表示式」。現在他們有兩個問題。
有趣,但卻是事實。這就是為什麼在 WordPress 中處理自訂重寫規則對於許多開發人員來說是一個挑戰。
不幸的是,我們無法演示重寫規則可以創建或支援的URL 架構的每種變體或類型,但我們可以看幾個實際示例,這些示例展示瞭如何開始並提供基礎或指導我們在未來的應用程式工作中需要做什麼。
需要注意的一件事是,當您定義重寫規則時,它們不會立即生效 - 它們已經刷新。這表示您需要刪除舊的規則集,並將其替換為新的規則集。
有兩種方法可以實現此目的:
functions.php
檔案中定義的任何內容都會被使用。 $wp_rewrite->flush_rules();
並以程式設計方式解決該問題。 無論您選擇哪種路線,記住此步驟都很重要,因為每次定義新的重寫規則時,您都需要刷新舊規則。
當實際編寫我們自己的重寫規則時,了解重寫 API 的工作原理非常重要。
它可以歸納為四個步驟:
index.php
,它将与网址的模式匹配。如果您有兴趣根据固定链接仪表板中的配置查看重写规则的定义,请查看重写规则检查器插件。
此插件将呈现当前用于匹配指定 URL 模式的所有规则的列表,包括正则表达式和针对 index.php
的匹配变量。
有道理吗?如果没有,让我们看几个简单实用的示例。
鉴于我们知道模式将被匹配并传递到 index.php
,我们可以利用 add_rewrite_rule
函数来定义自定义 URL 的工作方式。
假设我们正在查看系统中的第一篇帖子,即 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 规则
的文档,这很容易理解,对吧?
简而言之,它接受三个参数:
现在,这些示例都是基本的。这还不足以真正向我们展示如何设置自定义路由,例如我们在本文前面概述的路由。为此,我们需要看一些更复杂的表达式。
但在我们开始这样做之前,需要注意的是,像我们上面所做的那样调用 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 重寫功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!