現代 Web 應用程序開發框架最好的一點是,它們提供了一種生成真正干凈的路由(或 URL 方案)的方法,這些路由或 URL 方案映射到應用程序結構的概念模型。愛掏網 - it200.com
例如,給定某種類型的數據(例如個人),您可以執行以下操作:
- 添加
- 更新
- 刪除
等等。愛掏網 - it200.com
根據您的應用程序的性質,您可能可以執行更多操作(例如添加配偶),但就本文而言,基本的 CRUD 操作足以證明這一點。愛掏網 - it200.com
對于那些一直關注的人,我們一直在研究 WordPress 提供的作為應用程序開發基礎的各種功能。愛掏網 - it200.com在繼續討論時,我們有必要了解一下可用于自定義 WordPress 重寫規則的 API。愛掏網 - it200.com
普通用戶可能熟悉如何更改 WordPress 儀表板中的 URL 架構(我們將簡要討論這一點,以確保我們都在同一頁面上),但是,對于那些需要更改 URL 架構的用戶來說,還有更多功能可供使用。愛掏網 - it200.com了解 WordPress 中的 URL 重寫。愛掏網 - it200.com
事實上,我們有能力構建 URL 重寫規則來匹配和執行,就像現代基于 MVC 的框架一樣。愛掏網 - it200.com
為了確保我們都在同一頁面上,可以將重寫規則視為將特定模式與網絡服務器進行匹配以從數據庫檢索數據的方式。愛掏網 - it200.com
例如,在標準 WordPress 安裝中,默認的永久鏈接結構如下:
http://domain.com/?p=123登錄后復制
此 URL 包含一個查詢字符串參數,即 p=123
的鍵值對,在 WordPress 上下文中,它表示“檢索 ID 為 123 的帖子”。愛掏網 - it200.com
如果您深入查看固定鏈接設置屏幕上的選項,您還會看到各種選項:
您可能會看到的重寫規則的另一個示例是所謂的“漂亮的永久鏈接”,或者如 WordPress 儀表板中所命名的“帖子名稱”。愛掏網 - it200.com
在此格式中,URL 如下所示:
http://domain.com/post-title/登錄后復制
從這里開始,請求的 URL 進入 Web 服務器,然后根據一組規則確定具有該標題的帖子的 ID,并將其返回給請求客戶端(即瀏覽器)。愛掏網 - it200.com p>
在這兩個示例之間,有一個基本原則在起作用,它準確地演示了重寫規則是什么。愛掏網 - it200.com
簡而言之,重寫規則定義了一組規則,其中傳入的 URL 被轉換為客戶端從數據庫檢索信息的格式。愛掏網 - it200.com
當然,這提出了兩個問題:
- 重寫規則是如何生成的?
- 也許更重要的是,為什么它們如此復雜?
重寫規則對開發人員來說是一個挑戰,因為它們基于正則表達式。愛掏網 - it200.com Jamie Zawinski 有一句關于正則表達式的老話:
有些人在遇到問題時會想“我知道,我會使用正則表達式”。愛掏網 - it200.com現在他們有兩個問題。愛掏網 - it200.com
有趣,但卻是事實。愛掏網 - it200.com這就是為什么在 WordPress 中處理自定義重寫規則對于許多開發人員來說是一個挑戰。愛掏網 - it200.com
不幸的是,我們無法演示重寫規則可以創建或支持的 URL 架構的每種變體或類型,但我們可以看幾個實際示例,這些示例展示了如何開始并提供基礎或指導我們在未來的應用程序工作中需要做什么。愛掏網 - it200.com
刷新重寫規則
需要注意的一件事是,當您定義重寫規則時,它們不會立即生效 - 它們已經被刷新。愛掏網 - it200.com這意味著您需要刪除舊的規則集,并將其替換為新的規則集。愛掏網 - it200.com
有兩種方法可以實現此目的:
- 您可以在固定鏈接設置儀表板中點擊保存更改。愛掏網 - it200.com盡管事實上會選擇一個選項,但您在應用程序的
functions.php
文件中定義的任何內容都將被使用。愛掏網 - it200.com - 您可以調用
$wp_rewrite->flush_rules();
并以編程方式解決該問題。愛掏網 - it200.com
無論您選擇哪種路線,記住此步驟都很重要,因為每次定義新的重寫規則時,您都需要刷新舊規則。愛掏網 - it200.com
重寫 API 如何工作?
當實際編寫我們自己的重寫規則時,了解重寫 API 的工作原理非常重要。愛掏網 - it200.com
它可以歸納為四個步驟:
- 從網絡服務器請求 URL。愛掏網 - it200.com
- 如果請求的網址存在內容,則將返回該內容(可以是圖像、字體或其他內容)。愛掏網 - it200.com
- 如果內容不存在,則請求將被定向到
index.php
,它將與網址的模式匹配。愛掏網 - it200.com - 內容隨后將從 WordPress 返回到請求客戶端。愛掏網 - it200.com
如果您有興趣根據固定鏈接儀表板中的配置查看重寫規則的定義,請查看重寫規則檢查器插件。愛掏網 - it200.com
此插件將呈現當前用于匹配指定 URL 模式的所有規則的列表,包括正則表達式和針對 index.php
的匹配變量。愛掏網 - it200.com
有道理嗎?如果沒有,讓我們看幾個簡單實用的示例。愛掏網 - it200.com
鑒于我們知道模式將被匹配并傳遞到 index.php
,我們可以利用 add_rewrite_rule
函數來定義自定義 URL 的工作方式。愛掏網 - it200.com
帖子 ID 的簡短標題
假設我們正在查看系統中的第一篇帖子,即 ID 為 1 的帖子。愛掏網 - it200.com
在大多數普通 WordPress 安裝中,這是Hello World,URL 通常為 http://domain.com/hello-world
或 http://domain.com/? p=1
取決于您的永久鏈接設置(即您當前的重寫規則集)。愛掏網 - it200.com
但是讓我們定義一個規則,以便 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' );登錄后復制
讓我們再添加一條規則,該規則將允許我們在數據庫中加載第二篇文章。愛掏網 - it200.com即 http://domain.com/?p=2
。愛掏網 - it200.com
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 匹配的正則表達式。愛掏網 - it200.com在我們的例子中,我們使用簡單的單詞。愛掏網 - it200.com
- 第二個參數是實際獲取的 URL。愛掏網 - it200.com同樣,在我們的例子中,我們分別檢索第一篇和第二篇帖子。愛掏網 - it200.com
- 最后,最后一個參數是優先級,可以是“top”或“bottom”。愛掏網 - it200.com如果設置為“top”,則該規則將優先于所有其他規則進行評估;但是,如果為“bottom”,則將最后評估。愛掏網 - it200.com
現在,這些示例都是基本的。愛掏網 - it200.com這還不足以真正向我們展示如何設置自定義路由,例如我們在本文前面概述的路由。愛掏網 - it200.com為此,我們需要看一些更復雜的表達式。愛掏網 - it200.com
導入有關刷新重寫規則的注釋
但在我們開始這樣做之前,需要注意的是,像我們上面所做的那樣調用 flush_rewrite_rules()
實際上是一種不好的做法。愛掏網 - it200.com它在上面的示例中有效,但實際上會減慢網站的加載時間。愛掏網 - it200.com
事實上,它實際上只需要在重寫規則發生變化時調用。愛掏網 - it200.com每當激活插件時都可能會發生這種情況,或者當激活主題時它可能會發生變化。愛掏網 - it200.com
無論如何,請確保正確掛鉤函數,以便重寫規則不會在每次加載頁面時刷新 - 只要重寫規則本身發生更改。愛掏網 - it200.com
為了引入一組更復雜的重寫規則,例如我們在本文前面通過 CRUD 操作詳細介紹的重寫規則,了解以下兩個函數非常重要:
-
add_rewrite_tag
會讓 WordPress 了解自定義查詢字符串變量。愛掏網 - it200.com這也與下一個函數結合使用。愛掏網 - it200.com -
add_rewrite_rule,
如前所述,將允許我們向 WordPress 添加額外的重寫規則(以及設置它們的優先級)。愛掏網 - it200.com
現在假設我們有一個名為個人的自定義帖子類型,它代表應用程序中的某個人。愛掏網 - it200.com然后,假設個人還具有以下方法和相應的可用網址:
-
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' );登錄后復制
接下來,我們需要為每個人定義這些自定義函數,以便它們在調用時更新數據庫中的正確記錄。愛掏網 - it200.com
在本例中,我們將定義兩個函數 - 一個用于更新個人,另一個用于刪除個人。愛掏網 - it200.com以下代碼還假設從瀏覽器提交的表單中將包含一些信息。愛掏網 - it200.com
具體來說,它假設將發送個人 ID、名字、姓氏和其他信息,以便更新個人。愛掏網 - it200.com
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, usewp_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
操作中,并且僅在用戶未以管理員身份登錄時觸發。愛掏網 - it200.com此外,還可以通過有條件地將其設置為僅在來自某個頁面時加載來進一步增強此功能;然而,對于這個例子來說,它達到了它的目的。愛掏網 - it200.com
接下來,閱讀 Update
和 Delete
函數的代碼注釋,了解它們應如何運行。愛掏網 - it200.com
最后,請注意,最后兩個函數是簡單的幫助程序,旨在允許我們在初始掛鉤函數中編寫更清晰的代碼。愛掏網 - it200.com
有點不完整
我知道,這是一個不完整的示例,但對于一篇冗長的文章和一個復雜的主題,我的目標是盡我所能來展示 WordPress Rewrite API,討論使用它的優點,并討論如何使用它來創建更清晰的 URL 路由。愛掏網 - it200.com
事實是,這仍然是一個具有挑戰性的主題,并且最好通過實施來掌握。愛掏網 - it200.com盡管如此,這是 WordPress 應用程序的另一個組件,使其可以作為 Web 應用程序開發的基礎。愛掏網 - it200.com
說了這么多,現在是時候討論緩存的概念了。愛掏網 - it200.com
當然,有很多可用于 WordPress 的緩存插件,但如果您是開發人員,您希望構建一定程度的本機緩存,并且您希望利用 WordPress API 來實現所以。愛掏網 - it200.com如果是這種情況,熟悉可用的內容以及如何操作就很重要。愛掏網 - it200.com
話雖如此,我們接下來將注意力轉向 Transients API,以便我們可以自己處理一些本機緩存,并回顧這如何幫助第三方緩存機制使我們的應用程序更快。愛掏網 - it200.com
以上就是探索用于 Web 應用程序開發的 WordPress 功能:解鎖 URL 重寫功能的詳細內容,更多請關注愛掏網 - it200.com其它相關文章!