WordPress如何創(chuàng)建博客頁面?插件又如何修改這一創(chuàng)建過程,?本文對這兩個(gè)問題進(jìn)行了簡要分析,。文章針對即將進(jìn)行高級查詢和永久鏈接的插件開發(fā)人員以及希望進(jìn)一步了解WordPress的開發(fā)人員,希望大家能通過本文的介紹進(jìn)一步擴(kuò)展WordPress的功能或修復(fù)WordPress中的BUG,。
大家可以通過本文中提到的WordPress核心PHP文件和函數(shù)了解更多相關(guān)信息,。
下面是WordPress決定網(wǎng)頁顯示內(nèi)容(日志或是頁面)的過程以及相關(guān)顯示步驟:
- 訪問者首次點(diǎn)擊或輸入我們某個(gè)博客頁面的URL時(shí),WordPress會執(zhí)行一些核心文件(如(wp-config.php,
wp-settings.php等),。執(zhí)行任何一個(gè)PHP文件都會引發(fā)/包含其它PHP文件,,因此對文件加載順序的細(xì)節(jié)有興趣的讀者可以以
index.php為起點(diǎn),跟蹤文件的反應(yīng)鏈,。
- WordPress加載我們所激活的插件并將插件初始化(調(diào)用插件的init動作函數(shù)),。
- 出于對插件國際化的考慮,WordPress加載“文本域”,,并從當(dāng)前主題中加載functions.php文件,。
- WordPress運(yùn)行wp-includes/functions.php中的wp()函數(shù)。該函數(shù)將調(diào)
用$wp->main()($wp是WP類的一個(gè)對象,,$wp在wp-includes/classes.php中有定義),。根據(jù)這一
步,WordPress會:
- 用WP->parse_request()將URL解析成一個(gè)查詢說明
- 通過$wp_query->parse_query()($wp_query是類WP_Query的一個(gè)對象,,在wp-
includes/query.php中定義)設(shè)置條件標(biāo)簽使用的所有is_
變量,。注意,由于WP->parse_request()已經(jīng)事先完成了解析任務(wù),,因此WP_Query->parse_query()在這
里不會再執(zhí)行任何解析工作,。
- 在WP_Query->get_posts()函數(shù)中將查詢說明轉(zhuǎn)換為MySQL數(shù)據(jù)庫查詢,執(zhí)行該數(shù)據(jù)庫查詢,,獲取日志列表,。將日志保存在 $wp_query對象中,,以便日后用于WordPress主循環(huán)中。
- 處理404錯(cuò)誤,。
- 發(fā)送博客的HTTP信息頭,。
- 為WordPress主循環(huán)設(shè)置變量。
- WordPress加載我們的模板,,根據(jù)模板層級決定應(yīng)使用的模板文件,,然后執(zhí)行該模板文件(執(zhí)行時(shí)基本上會依照模板文件的操作說明)。WordPress也可以執(zhí)行某個(gè)feed文件來代替指定模板文件(比如wp-rss2.php),。
- 一般情況下,,模板文件或feed文件會執(zhí)行WordPress主循環(huán)以顯示博客日志或是某個(gè)靜態(tài)頁面。
- 模板文件和feed文件還會顯示一些存檔,、類別的永久鏈接或是使用內(nèi)置WordPress函數(shù)的日志的永久鏈接,。
WP->parse_request()
詳細(xì)信息
上文中提到, WP->parse_request()(wp-includes/classes.php文件中,,WP類的一部分)將URL解析成一個(gè)查詢說明,。下面是對解析步驟的概括:
- 從URL中刪去GET變量(例如,URL中“,?”后的所有內(nèi)容),,網(wǎng)站主頁URL中的GET變量也應(yīng)刪除。
- 調(diào)用
$wp_rewrite->wp_rewrite_rules()($wp_rewrite是類WP_Rewrite的一個(gè)對象,,在wp-
includes/rewrite.php中定義)以獲取當(dāng)前有效的重寫規(guī)則,。重寫規(guī)則是一系列關(guān)于WordPress永久鏈接格式的規(guī)定以及格式與規(guī)定
相匹配時(shí)的操作說明。例如,,假設(shè)現(xiàn)在有一個(gè)規(guī)則,,該規(guī)則能夠與刪除變量后的永久鏈接(如category/abc)相匹配,且該規(guī)則說明表
示,,category/abc意味著請求“abc”類別,。那么這也算是主頁的一個(gè)重寫規(guī)則(網(wǎng)站URL后沒有其它內(nèi)容)。
- 按順序檢查重寫規(guī)則,,直到找到某個(gè)重寫規(guī)則與永久鏈接能相匹配,。沒有條件符合要求時(shí)返回404錯(cuò)誤。如果有條件符合要求,,WordPress會根據(jù)規(guī)則的說明摘取信息,。
-
獲取當(dāng)前有效的查詢變量列表。WordPress會檢查所有查詢變量,,判斷鏈接解析,、日志提交或GET提交過程是否已經(jīng)設(shè)定了這些變量。如果變量被設(shè)
定,,WordPress將變量值存入查詢說明數(shù)組($wp->query_vars,,wp-includes/classes.php中WP類的一
部分),。
插件能夠修改的內(nèi)容
下面列出插件對以上默認(rèn)查詢和永久鏈接動作所具備的修改范圍。
- 添加,、修改或刪除重寫規(guī)則,,從而影響永久鏈接的解析方式。一般情況下插件會調(diào)用wp-includes/rewrite.php
中的函數(shù)(如add_rewrite_rule,
add_rewrite_endpoint等)而不是用過濾器函數(shù)或動作函數(shù)來完成以上添加,、修改或刪除過程,。因?yàn)?
WP_Rewrite->wp_rewrite_rules()通常只獲取之前保存的重寫規(guī)則(這些重寫規(guī)則作為“rewrite_rules”選
項(xiàng)被保存在WordPress數(shù)據(jù)庫里)。因此如果我們要修改重寫規(guī)則,,首先要調(diào)用$wp_rewrite->flush_rules()強(qiáng)制進(jìn)行
重新計(jì)算,。這一動作要在插件的init動作中完成。
- 添加或刪除查詢變量,,從而影響日志,、GET變量和永久鏈接請求(query_vars過濾器)中查詢說明所保存的變量。
保存變量值后,,修改查詢說明(request過濾器或parse_request動作函數(shù),;若希望使用條件標(biāo)簽檢驗(yàn),可使用parse_query或pre_get_posts動作函數(shù),。is_變量設(shè)置完畢后WordPress才運(yùn)行這兩個(gè)函數(shù))。
- MySQL數(shù)據(jù)庫查詢從查詢說明中生成后,,插件可修改MySQL數(shù)據(jù)庫查
詢(posts_where, posts_join, posts_groupby, posts_orderby, posts_distinct,
posts_fields, post_limits, posts_where_paged, posts_join_paged, and
posts_request 過濾器函數(shù)),。
- 修改數(shù)據(jù)庫查詢的結(jié)果(the_posts過濾器)。
- 改寫默認(rèn)模板文件的選擇(template_redirect動作),。
|