本部分教程包括以下內(nèi)容:
- 了解什么是插件
- 使用可用的 WordPress APIs
- 插件的加載順序
- 熱門插件示例
- 分別插件和主題功能上的不同
- 安裝和管理插件
- 了解插件的類型
WordPress 是現(xiàn)在很火的開源免費的內(nèi)容管理系統(tǒng)。它火的一個重要原因就是你可以方便的通過插件來自己定制它。WordPress 為開發(fā)者提供了一個十分方便且強大的平臺。
首先明白插件如何工作的,以及 WordPress 中所包含的工具,是開發(fā)專業(yè)的 WordPress 插件的關鍵。
什么是插件
插件( Plugins )是如何與 WordPress 交互的
WordPress 為插件提供了多種豐富的 APIs。每一種 API( 應用程序接口 )使插件和 WordPress 以不同的方式交互。下面是 WordPress 提供的主要 APIs 以及他們的功能列表:
- 插件: 給插件提供一系列的鉤子( hooks )來使用 WordPress 的相關部分。WordPress 包含兩種不同類型的鉤子: 動作( Actions )和過濾器( Filters )。動作讓你可以在運行時的特定時刻觸發(fā)自定義的插件代碼。例如,可以在用戶在 WordPress 中注冊了一個賬戶后觸發(fā)一個自定義函數(shù)。 過濾器用來修改在數(shù)據(jù)庫中添加或獲取的數(shù)據(jù)。
- 小工具( Widgets ): 在你的插件中創(chuàng)建和管理小工具。Widgets 在 Appearance -> Widgets 下面,并可以在你的模板中任何注冊過的 sidebar 中添加。這個 API 允許在 sidebar 里面添加一個 widget 的多個實例。
- 短代碼( Shortcode ):為你的插件提供短代碼支持。短代碼是一個可以讓你通過類似這樣[shortcode]的方法調(diào)用一個 PHP 函數(shù)的鉤子。
- HTTP: 從你的插件發(fā)送 HTTP 請求。這個 API 可以從一個外部的 URL 獲取或者提交內(nèi)容。目前你有5種發(fā)送 HTTP 請求的不同方法。這個 API 在每個方法執(zhí)行前使過程標準化。這個 API 會基于你的服務器的設置使用合適的方法來發(fā)送請求。
- 設置( Settings ): 在你的插件中插入設置部分。使用設置 API 的主要好處就是安全。所有的設置數(shù)據(jù)都是檢查過的,所以當你保存插件設置時不用擔心跨站虛假請求攻擊( cross site request forgery, CSRF) 和跨站腳本( cross site scripting XSS )攻擊。
- 選項( Options ): 在你的插件中保存和獲取選項。這個 API 允許創(chuàng)建新選項,更新現(xiàn)有選項,刪除選項以及可選的控制板( Dashboard )定義。
- 小工具( Widgets ): 創(chuàng)建控制板小工具。小工具自動出現(xiàn)在 WordPress 的后臺控制板中,并且包含標準的自定義操作,包括最小化、拖拽和隱藏。
- 重寫( Rewrite ): 在插件中創(chuàng)建自定義的重寫規(guī)則。這個 API 讓你添加靜態(tài)鏈接-點( /custom-page/),結構標簽( %postname% ),和附加的 feed 鏈接( /feed/json/ )。
- 臨時選項( Transients ): 在你的插件中創(chuàng)建臨時選項( 緩存數(shù)據(jù) )。這個 API 類似于 選項( Options ) API,只不過所有的選項都有過期時間。
- 數(shù)據(jù)庫( database ): 可以訪問 WordPress 數(shù)據(jù)庫。可以再你的插件中增刪改查數(shù)據(jù)庫記錄。
WordPress 中的函數(shù)也可以是”插件”(插件函數(shù))。這些函數(shù)讓你可以繼承一個插件里面的核心函數(shù)。例如,wp_mail() 函數(shù)就是一個”插件函數(shù)”。你可以在你的插件中定義這個函數(shù),然后使用 SMTP 而不是默認的方法來發(fā)送郵件。所有的”插件函數(shù)”都定義在 /wp-includes/pluggable.phpCore 文件中。在特定的插件任務過程中,你可以使用一些預定義的函數(shù),例如當一個插件啟用或者停用或者刪除插件的時候。在第二章: 插件基礎, 中將詳細介紹
插件什么時候加載

插件在 WordPress 頁面調(diào)用之前加載。
圖 1-1 顯示了 WordPress 頁面加載的標準過程。在加載 admin 頁面的時候流程有少許變化。不過差異很小,主要是關于加載什么模板的:管理頁面模板或者網(wǎng)站模板。
可用的插件
你要知道在哪里找 WordPress 插件。網(wǎng)上到處都能下載到插件,但是這并不總是個好主意。從不可靠的地方下載插件可能導致惡意軟件注入,以及危害其他插件。最好從官方網(wǎng)站以及可靠的網(wǎng)站下載插件。
官方插件下載地址
找插件第一個考慮的地方就是 wordpress.org 官方插件地址
超過10,000種插件供選擇,上億次的下載量。這里的插件是 100% 遵循 GPL 的免費的供個人或者商業(yè)使用的。
熱門插件
下面是5個下載次數(shù)最多的插件:
-
All in One SEO Pack — 為 WordPress 提供高級的搜索引擎優(yōu)化( SEO )的功能。包括為所有的內(nèi)容提供自定義的 meta 數(shù)據(jù),規(guī)范的 URL,自定義提交類型( post type )支持,等等。
https://wordpress.org/extend/plugins/all-in-one-seo-pack/
-
Google XML Sitemaps — 為提交到搜索引擎的內(nèi)容生成一個 XML 網(wǎng)站地圖。
https://wordpress.org/extend/plugins/google-sitemap-generator/
-
Akismet — 流行的垃圾評論( spam )過濾器。通過 Akismet 網(wǎng)站的服務檢查么一個評論是否是垃圾評論。WordPress 默認安裝此插件。
https://wordpress.org/extend/plugins/akismet/
-
NextGEN Gallery — 未 WordPress 提供高級的相冊支持。使你能夠方便的創(chuàng)建和管理相冊( gallery )以及幻燈片( slide show )。相冊可以添加在文章( posts ) 以及頁面( pages )中。
https://wordpress.org/extend/plugins/nextgen-gallery/
-
Contact Form 7 — 為任何一個文章或者頁面添加聯(lián)系表單( form )。支持多表單,Akismet 評論過濾,以及驗證碼( CAPTCHA )。
https://wordpress.org/extend/plugins/contact-form-7/
如你所見,上面的插件可以解決很多問題。這些插件提供的功能是非常常用的,也是許多網(wǎng)站需要具備的功能。
使用插件的優(yōu)勢
在 WordPress 中使用插件有許多優(yōu)勢。你需要理解編寫插件的優(yōu)勢,從而真正的明白為什么要編寫插件。這也能在編寫一個特殊的插件時幫助理解需求。
不修改核心
使用插件的一個主要優(yōu)勢在于,控制 WordPress 的功能,而不需要修改任何核心文件。核心文件是指所有WordPress 默認安裝的文件。
修改核心文件會為升級 WordPress 新版本的時候帶來麻煩。如果你修改了 WordPress 的任何核心文件,在升級的時候這些修改就會被覆蓋重寫。而更新 WordPress 最重要的是為了保證你的網(wǎng)站的安全。
修改核心文件同樣可能引起網(wǎng)站的不穩(wěn)定。WordPress 中不同的部分的功能的實現(xiàn)要依賴于其他部分。如果你修改了核心文件是它不能按期望的工作,則可能會一起不穩(wěn)定,甚至很可能破壞整個不相關的功能。
為什么還要重新造輪子呢?
編寫插件的另一個優(yōu)勢在于,整個架構已經(jīng)是現(xiàn)成的了。許多通用的功能已經(jīng)開發(fā)好了并可以直接在你的插件中直接使用了。例如:使用 WordPress 中內(nèi)建的用戶角色,你可以很容易的限制你的代碼只有用戶為管理員時才執(zhí)行。看下面的例子:
<?php
if( current_user_can( 'manage_options' )) {
// 這里面的代碼只有用戶是 管理員的時候才執(zhí)行。
}
?>
如你所見,很容易驗證一個用戶有特定的權限來執(zhí)行你插件中的代碼。在第八章,“用戶”中你可以看到賬戶和角色的內(nèi)容。
另外一個例子,看看在 WordPress 中發(fā)送郵件。當然你可以創(chuàng)建自己的發(fā)送郵件的插件,可以有什么必要呢?WordPress 有叫做 wp_mail() 用來發(fā)送郵件的輔助函數(shù)。看下面的例子:
<?php
$email_to = 'you@example.com';
$email_subject = '郵件例子';
$email_message = '我的新插件怎么樣?';
$wp_mail( $email_to, $email_subject, $email_message );
?>
正如你所見,在 WordPress 中發(fā)送郵件是多么的容易。除非你的插件需要一些自定義的郵件功能,否則你么必要從頭來寫這些功能。使用這個函數(shù)同樣可以確保從 WordPress 中發(fā)郵件時最廣泛的適用因為你使用的是內(nèi)建的函數(shù)。
使用 WordPress 內(nèi)建的功能可以節(jié)省你開發(fā)插件的時間。使用這些內(nèi)建的函數(shù)而不是重造車輪的另一個好處是可以使你的插件在各種不同的服務器環(huán)境和設置下正常工作,因此最大化了兼容性。不要重建 WordPress 中已經(jīng)有的車輪!
區(qū)分插件和主題
一個插件可以控制表現(xiàn)的過程;因此一個插件可以變成一個“主題”。類似的,主題可以包含插件的功能。因為有時候兩個之間的區(qū)別會變得模糊,那為什么不直接在你的主題目錄中直接包含插件呢?這是一個普遍的問題,也有幾個不同的回答。
主題應該包含插件的功能嗎?答案是:不應該。主要的原因是因為插件是用來為 WordPress 來添加功能的,而不管用的是哪個主題。這就將你網(wǎng)站的設計和網(wǎng)站的功能很好的區(qū)分開來。這個區(qū)分是為了你的主題不用捆綁所需要的功能。WordPress 使得你非常容易的改變你的設計,或者說主題,任何時候至于要點幾下。如果所有的主題功能都包含在你的主題中,當你換主題的時候,你就會失去那些功能。
還有另一個激烈的爭論是:核心功能應該包含在主題中。大多數(shù)主題具有的一個普遍功能是 “我在這里” ( breadcrumb ) 導航。這個功能當然可以存在在一個插件中,但是導航欄作為一個核心功能 – 應當包含在主題當中。而且搜素引擎優(yōu)化功能作為一個常用功能也應該包含在主題中。
方便更新
WordPress 使得更新插件很容易。所有從wordpress.org 官方插件地址 下載安裝的插件在有新版本的時候都會提醒你更新。更新插件只需要在后臺插件頁面中間的的操作就可以搞定。
而不是從官方插件目錄安裝的插件也可以使用 WordPress 的自動更新功能來更新。插件作者必須設定在哪里可以得到插件的新版本,這樣就可以自動更新了。而如果插件的作者沒有定義更新的地址,你就必須手動更新插件了。
保持插件更新是使你的網(wǎng)站免受攻擊以及消除bug的重要步驟。
方便共享和重用
插件可以很方便的與他人共享。共享一個插件比告訴別人如何修改你的模板的代碼容易多了。使用插件同樣可以使多個網(wǎng)站具有同樣的功能。如果你發(fā)現(xiàn)了你喜歡的一些插件,你可以方便的在你的每一個 WordPress 網(wǎng)站上面安裝和使用。
插件沙盒
當你在 WordPress 中啟用了一個損壞的插件,它不會毀掉你整個網(wǎng)站。如果插件觸發(fā)了一個致命錯誤,WordPress 會在它造成破壞之前自動停用它。這種安全的特性使啟用和測試新插件的時候的風險大大降低。雖然插件確實會引起錯誤的白屏或者錯誤信息,你可以簡單的把插件的目錄重命名,這樣 WordPress 就會自動的停用它了。這樣就避免了流氓插件把你自己鎖在自己的網(wǎng)站外面。
換句話說,如果你直接修改了 WordPress 的核心文件,你很可能引起一些導致整個網(wǎng)站崩潰的致命錯誤。這包括造成使得 WordPress 無法修復的損害。
插件開發(fā)社區(qū)
插件開發(fā)有很強大的社區(qū)支持,分享知識和代碼,并且開發(fā)有用的插件。加入這些社區(qū)是提高你的插件開發(fā)能力的一個非常好的方法。第十八章,”開發(fā)人員工具箱” 中將包含許多相關信息。
插件的安裝和管理
WordPress 所有插件的管理都在 WordPress 控制板的”插件“頁面下,如圖 1-2 所示。

圖 1-2 中的菜單只對”管理員“可見,非管理員用戶是看不到的。如果你使用 WordPress 的多站點功能,插件的菜單默認是隱藏的。你需要在 Admin -> Settings 中啟用這個菜單。
安裝插件
WordPress 中有三種安裝插件的方法。你可以選擇其中方便快捷適合你的。
第一種方法:使用內(nèi)建的安裝程序。這種方法允許你在“控制板”中搜索wordpress.org 官方的插件。找到后點擊安裝,這個插件就會自動下載安裝了。
第二種方法:使用 zip 上傳程序。你可以上傳插件的 zip 壓縮文件,WordPress 可以解壓并且安裝它。使用這種方法只需要在插件安裝頁面點擊“瀏覽”( Browser )按鈕,然后選擇插件的 zip 壓縮文件上傳,點擊 現(xiàn)在安裝( Install Now )按鈕來安裝。如圖 1-3 所示。

第三種方法:使用 FTP 協(xié)議來安裝插件。這種方法就是使用FTP客戶端程序連接你的網(wǎng)站服務器,手動上傳插件的整個目錄或者文件到 WordPress 的 wp-content/plugin/ 目錄下。
管理插件
編輯插件
擴展閱讀《WordPress入門 之 安裝主題和插件》
插件目錄
很少人知道,實際上 WordPress 有兩個插件的目錄。主插件目錄在 wp-content/plugins/ 下面,在安裝 WordPress 時自動創(chuàng)建。第二個插件目錄位于 wp-content/mu-plugins 下面,表示“必須使用” ( Must-Use ),它不是由 WordPress 自動創(chuàng)建的。你必須親自創(chuàng)建來用。
兩者之間主要的不同在于,mu-plugins 目錄是用來放永遠執(zhí)行的插件的。這意味著,在這個目錄下的插件會自動的在 WordPress 以及多站點中加載
mu-plugins 目錄不會識別子目錄,所以所有的插件必須是獨立的文件,或者是包含一個子目錄中的附件文件。除了在主插件文件中被包含的子目錄中的內(nèi)容,子目錄中其他內(nèi)容都會被忽略。
插件的類型

WordPress 的插件有幾種不同的狀態(tài)。如圖 1-4 所示。你在開發(fā)和管理插件的時候需要了解這些不同。
- 啟用( Active ) — 在 WordPress 正在使用的插件。
- 停用( Inactive ) — 安裝了但是沒有啟用。插件中的代碼不會被執(zhí)行
- 必須使用( Must-Use ) — 所有安裝在 wp-content/mu-plugins 目錄下的插件。這些插件會自動加載。唯一停用 MU 插件的方法是從 mu-plugins 目錄中將其刪除。
- Drop-ins — WordPress 中的核心功能可以被 Drop-in 插件代替。這些插件是位于 wp-content 目錄下的一些有特殊文件名的 PHP 文件,它們會被自動加載,并列在插件管理頁面的 Drop-in 過濾器下。以下十種 Drop-in 插件可用:
- advanced-cache.php — 高級緩存插件
- db.php — 自定義數(shù)據(jù)庫類
- db-error.php — 自定義數(shù)據(jù)庫錯誤信息
- install.php — 自定義安裝腳本
- maintenance.php — 自定義維護信息
- object-cache.php — 擴展的對象緩存
- sunrise.php — 自定義域名映射
- blog-deleted.php — 自定義 blog 刪除信息
- blog-inactive.php — 自定義 blog 停用信息
- blog-suspended.php — 自定義 blog 掛起信息
最后四個 Drop-in 插件,是 WordPress 多站點功能所特有的。標準安裝的 WordPress 是沒有這些插件的用法的。
當開發(fā)一個新插件的之前,先確定你想創(chuàng)建哪一種類型的插件。大部分插件都是 WordPress 標準的插件,但是偶爾你可能需要創(chuàng)建 Must-Use 插件或者 Drop-in 插件。
測試插件的功能
有時候你能你只是想測試一個插件功能,而不是真的創(chuàng)建一個插件。許多開發(fā)者會直接將代碼放進 wp-config.php 文件當中來進行功能測試。這是一種不好的方法,不應該用它,因為當 config.php 文件解析和加載后,WordPress 還沒有完全的啟動。
不要用修改 wp-config.php 的方法,而是用下面的代碼段建立一個 test.php 文件并放在你的 WordPress 根目錄下:
<?php
// 加載 WordPress 環(huán)境
// define( 'WP_DEBUG', true ); / * 要 debug 模式 取消注釋。*/
require( './wp-load.php' );
// require_once( './wp-admin/admin.php' ); /* 要 is_admin() 取消注釋 */
?>
<pre>
<?php
/* 下面是測試的代碼 */
var_dump( is_admin() );
?>
</pre>
這一一種加載所有 WordPress 功能來測試插件功能而不用創(chuàng)建一個插件的快速方法。正如你所見,在文件開頭包含wp-load.php 文件。你也可以包含 wp-admin/admin.php 文件如果你想測試管理員的功能。一旦你包含了 WordPress 所需要的核心文件,你就可以測試任何代碼了。在測試完成后,別玩了刪除 text.php 文件。
總結
這一章,我們學到了什么是插件,以及它們?nèi)绾瓮?WordPress 的 APIs 進行交互。我們討論了使用插件的主要優(yōu)勢以及為什么插件的功能不應該全部直接放在模板里面。我們還討論了在后臺控制板中安裝和管理插件。
現(xiàn)在你已經(jīng)明白了插件在 WordPress 中如何工作,我們是時候開始編寫插件了!
注:本文出自《Professional WordPress Plugin Development》一書,由 sixpoint.me 翻譯,倡萌整編。
您已閱讀完《WordPress 插件開發(fā)教程(共4篇)》專題的第 1 篇。請繼續(xù)閱讀該專題下面的文章:





wp_main() ?寫錯了
多謝提醒,已修正
為什么沒有評論呢?我是來學習插件開發(fā)的 謝謝啊