探索用于 Web 應(yīng)用程序開發(fā)的 WordPress 功能:解鎖 URL 重寫功能

現(xiàn)代 web 應(yīng)用程序開發(fā)框架最好的一點(diǎn)是,它們提供了一種生成真正干凈的路由(或 url 方案)的方法,這些路由或 url 方案映射到應(yīng)用程序結(jié)構(gòu)的概念模型。

例如,給定某種類型的數(shù)據(jù)(例如個人),您可以執(zhí)行以下操作:

  • 添加
  • 更新
  • 刪除

等等。

根據(jù)您的應(yīng)用程序的性質(zhì),您可能可以執(zhí)行更多操作(例如添加配偶),但就本文而言,基本的 CRUD 操作足以證明這一點(diǎn)。

對于那些一直關(guān)注的人,我們一直在研究 WordPress 提供的作為應(yīng)用程序開發(fā)基礎(chǔ)的各種功能。在繼續(xù)討論時,我們有必要了解一下可用于自定義 WordPress 重寫規(guī)則的 API。

普通用戶可能熟悉如何更改 WordPress 儀表板中的 URL 架構(gòu)(我們將簡要討論這一點(diǎn),以確保我們都在同一頁面上),但是,對于那些需要更改 URL 架構(gòu)的用戶來說,還有更多功能可供使用。了解 WordPress 中的 URL 重寫。

事實(shí)上,我們有能力構(gòu)建 URL 重寫規(guī)則來匹配和執(zhí)行,就像現(xiàn)代基于 mvc 的框架一樣。


了解重寫規(guī)則

為了確保我們都在同一頁面上,可以將重寫規(guī)則視為將特定模式與網(wǎng)絡(luò)服務(wù)器進(jìn)行匹配以從數(shù)據(jù)庫檢索數(shù)據(jù)的方式。

例如,在標(biāo)準(zhǔn) WordPress 安裝中,默認(rèn)的永久鏈接結(jié)構(gòu)如下:

http://domain.com/?p=123 

此 URL 包含一個查詢字符串參數(shù),即 p=123 的鍵值對,在 WordPress 上下文中,它表示“檢索 ID 為 123 的帖子”。

如果您深入查看固定鏈接設(shè)置屏幕上的選項,您還會看到各種選項:

探索用于 Web 應(yīng)用程序開發(fā)的 WordPress 功能:解鎖 URL 重寫功能

您可能會看到的重寫規(guī)則的另一個示例是所謂的“漂亮的永久鏈接”,或者如 WordPress 儀表板中所命名的“帖子名稱”。

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

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

從這里開始,請求的 URL 進(jìn)入 Web 服務(wù)器,然后根據(jù)一組規(guī)則確定具有該標(biāo)題的帖子的 ID,并將其返回給請求客戶端(即瀏覽器)。 p>

在這兩個示例之間,有一個基本原則在起作用,它準(zhǔn)確地演示了重寫規(guī)則是什么。

簡而言之,重寫規(guī)則定義了一組規(guī)則,其中傳入的 URL 被轉(zhuǎn)換為客戶端從數(shù)據(jù)庫檢索信息的格式。

當(dāng)然,這提出了兩個問題:

  1. 重寫規(guī)則是如何生成的?
  2. 也許更重要的是,為什么它們?nèi)绱藦?fù)雜?

重寫規(guī)則的業(yè)務(wù)

重寫規(guī)則對開發(fā)人員來說是一個挑戰(zhàn),因?yàn)樗鼈兓?a href="http://www.babyishan.com/tag/%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f">正則表達(dá)式。 Jamie Zawinski 有一句關(guān)于正則表達(dá)式的老話:

有些人在遇到問題時會想“我知道,我會使用正則表達(dá)式”?,F(xiàn)在他們有兩個問題。

有趣,但卻是事實(shí)。這就是為什么在 WordPress 中處理自定義重寫規(guī)則對于許多開發(fā)人員來說是一個挑戰(zhàn)。

不幸的是,我們無法演示重寫規(guī)則可以創(chuàng)建或支持的 URL 架構(gòu)的每種變體或類型,但我們可以看幾個實(shí)際示例,這些示例展示了如何開始并提供基礎(chǔ)或指導(dǎo)我們在未來的應(yīng)用程序工作中需要做什么。

刷新重寫規(guī)則

需要注意的一件事是,當(dāng)您定義重寫規(guī)則時,它們不會立即生效 – 它們已經(jīng)被刷新。這意味著您需要刪除舊的規(guī)則集,并將其替換為新的規(guī)則集。

有兩種方法可以實(shí)現(xiàn)此目的:

  1. 您可以在固定鏈接設(shè)置儀表板中點(diǎn)擊保存更改。盡管事實(shí)上會選擇一個選項,但您在應(yīng)用程序的 functions.php 文件中定義的任何內(nèi)容都將被使用。
  2. 您可以調(diào)用 $wp_rewrite->flush_rules(); 并以編程方式解決該問題。

無論您選擇哪種路線,記住此步驟都很重要,因?yàn)槊看味x新的重寫規(guī)則時,您都需要刷新舊規(guī)則。

重寫 API 如何工作?

當(dāng)實(shí)際編寫我們自己的重寫規(guī)則時,了解重寫 API 的工作原理非常重要。

它可以歸納為四個步驟:

  1. 從網(wǎng)絡(luò)服務(wù)器請求 URL。
  2. 如果請求的網(wǎng)址存在內(nèi)容,則將返回該內(nèi)容(可以是圖像、字體或其他內(nèi)容)。
  3. 如果內(nèi)容不存在,則請求將被定向到 index.php,它將與網(wǎng)址的模式匹配。
  4. 內(nèi)容隨后將從 WordPress 返回到請求客戶端。

如果您有興趣根據(jù)固定鏈接儀表板中的配置查看重寫規(guī)則的定義,請查看重寫規(guī)則檢查器插件。

此插件將呈現(xiàn)當(dāng)前用于匹配指定 URL 模式的所有規(guī)則的列表,包括正則表達(dá)式和針對 index.php 的匹配變量。

探索用于 Web 應(yīng)用程序開發(fā)的 WordPress 功能:解鎖 URL 重寫功能

有道理嗎?如果沒有,讓我們看幾個簡單實(shí)用的示例。

重寫規(guī)則的示例

鑒于我們知道模式將被匹配并傳遞到 index.php,我們可以利用 add_rewrite_rule 函數(shù)來定義自定義 URL 的工作方式。

帖子 ID 的簡短標(biāo)題

假設(shè)我們正在查看系統(tǒng)中的第一篇帖子,即 ID 為 1 的帖子。

在大多數(shù)普通 WordPress 安裝中,這是Hello World,URL 通常為 http://domain.com/hello-world 或 http://domain.com/? p=1 取決于您的永久鏈接設(shè)置(即您當(dāng)前的重寫規(guī)則集)。

但是讓我們定義一個規(guī)則,以便 http://domain.com/first 也將加載數(shù)據(jù)庫中的第一篇文章:

function example_add_rewrite_rules() {  	add_rewrite_rule( 'first', 'index.php?p=1', 'top' ); 	flush_rewrite_rules();  } add_action( 'init', 'example_add_rewrite_rules' ); 

讓我們再添加一條規(guī)則,該規(guī)則將允許我們在數(shù)據(jù)庫中加載第二篇文章。即 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' ); 

假設(shè)您已經(jīng)閱讀了 add_rewrite 規(guī)則 的文檔,這很容易理解,對吧?

簡而言之,它接受三個參數(shù):

  • 第一個參數(shù)是與請求的 URL 匹配的正則表達(dá)式。在我們的例子中,我們使用簡單的單詞。
  • 第二個參數(shù)是實(shí)際獲取的 URL。同樣,在我們的例子中,我們分別檢索第一篇和第二篇帖子。
  • 最后,最后一個參數(shù)是優(yōu)先級,可以是“top”或“bottom”。如果設(shè)置為“top”,則該規(guī)則將優(yōu)先于所有其他規(guī)則進(jìn)行評估;但是,如果為“bottom”,則將最后評估。

現(xiàn)在,這些示例都是基本的。這還不足以真正向我們展示如何設(shè)置自定義路由,例如我們在本文前面概述的路由。為此,我們需要看一些更復(fù)雜的表達(dá)式。

導(dǎo)入有關(guān)刷新重寫規(guī)則的注釋

但在我們開始這樣做之前,需要注意的是,像我們上面所做的那樣調(diào)用 flush_rewrite_rules() 實(shí)際上是一種不好的做法。它在上面的示例中有效,但實(shí)際上會減慢網(wǎng)站的加載時間。

事實(shí)上,它實(shí)際上只需要在重寫規(guī)則發(fā)生變化時調(diào)用。每當(dāng)激活插件時都可能會發(fā)生這種情況,或者當(dāng)激活主題時它可能會發(fā)生變化。

無論如何,請確保正確掛鉤函數(shù),以便重寫規(guī)則不會在每次加載頁面時刷新 – 只要重寫規(guī)則本身發(fā)生更改。


重寫規(guī)則的更復(fù)雜方法

為了引入一組更復(fù)雜的重寫規(guī)則,例如我們在本文前面通過 CRUD 操作詳細(xì)介紹的重寫規(guī)則,了解以下兩個函數(shù)非常重要:

  • add_rewrite_tag 會讓 WordPress 了解自定義查詢字符串變量。這也與下一個函數(shù)結(jié)合使用。
  • add_rewrite_rule, 如前所述,將允許我們向 WordPress 添加額外的重寫規(guī)則(以及設(shè)置它們的優(yōu)先級)。

現(xiàn)在假設(shè)我們有一個名為個人的自定義帖子類型,它代表應(yīng)用程序中的某個人。然后,假設(shè)個人還具有以下方法和相應(yīng)的可用網(wǎng)址:

  • all: http://domain.com/individuals/
  • update: http://domain.com/individual/update/1 用于更新第一人稱
  • delete: http://domain.com/individual/delete/1 用于刪除第一個人

所以這個模式很簡單,但是我們?nèi)绾螌?shí)現(xiàn)它呢?

首先,我們需要定義重寫規(guī)則:

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' ); 

接下來,我們需要為每個人定義這些自定義函數(shù),以便它們在調(diào)用時更新數(shù)據(jù)庫中的正確記錄。

在本例中,我們將定義兩個函數(shù) – 一個用于更新個人,另一個用于刪除個人。以下代碼還假設(shè)從瀏覽器提交的表單中將包含一些信息。

具體來說,它假設(shè)將發(fā)送個人 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' ); } 

請注意,上面的第一個函數(shù)已掛接到 init 操作中,并且在用戶未以管理員身份登錄時觸發(fā)。此外,還可以通過有條件地將其設(shè)置為僅在來自某個頁面時加載來進(jìn)一步增強(qiáng)此功能;然而,對于這個例子來說,它達(dá)到了它的目的。

接下來,閱讀 Update 和 Delete 函數(shù)的代碼注釋,了解它們應(yīng)如何運(yùn)行。

最后,請注意,最后兩個函數(shù)是簡單的幫助程序,旨在允許我們在初始掛鉤函數(shù)中編寫更清晰的代碼。

有點(diǎn)不完整

我知道,這是一個不完整的示例,但對于一篇冗長的文章和一個復(fù)雜的主題,我的目標(biāo)是盡我所能來展示 WordPress Rewrite API,討論使用它的優(yōu)點(diǎn),并討論如何使用它來創(chuàng)建更清晰的 URL 路由。

事實(shí)是,這仍然是一個具有挑戰(zhàn)性的主題,并且最好通過實(shí)施來掌握。盡管如此,這是 WordPress 應(yīng)用程序的另一個組件,使其可以作為 Web 應(yīng)用程序開發(fā)的基礎(chǔ)。


下一個

說了這么多,現(xiàn)在是時候討論緩存的概念了。

當(dāng)然,有很多可用于 WordPress 的緩存插件,但如果您是開發(fā)人員,您希望構(gòu)建一定程度的本機(jī)緩存,并且您希望利用 WordPress API 來實(shí)現(xiàn)所以。如果是這種情況,熟悉可用的內(nèi)容以及如何操作就很重要。

話雖如此,我們接下來將注意力轉(zhuǎn)向 Transients API,以便我們可以自己處理一些本機(jī)緩存,并回顧這如何幫助第三方緩存機(jī)制使我們的應(yīng)用程序更快。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享