介紹
WordPress 插件 允許你對 WordPress 博客進行修改、自定義和加強。不必修改 WordPress 的核心程序,直接用插件的形式增加功能。下面是對 WordPress 插件的基本定義:
WordPress 插件:WordPress 插件是用 PHP 語言寫成的一只或者一組程序。這些程序可以為 WordPress 增加某些原來沒有的功能,這樣使用者看起來仿佛就是這個博客固有的功能。 插件 API
想為你的博客添加功能嗎?那么最簡單的方法就是搜搜看有沒有現(xiàn)成的插件。如果很不幸——沒有,那么這篇文章會指導(dǎo)你自己開發(fā)一個。
本文假設(shè)你已經(jīng)熟悉 WordPress 的基本功能,以及 PHP 編程。
資源
- 在 插件資源集合 有各種你可能需要的資源,包括外站關(guān)于寫插件的文章,以及特定主題的文章。
- 學習一個叫 Hello Dolly 的插件“范本”可以領(lǐng)你入門。
- 如果你的插件已經(jīng)寫完了,并自以為寫的不錯,查看 插件提交以及推廣。
新建一個插件
這個部分告訴你怎么把開發(fā)插件的理想變?yōu)楝F(xiàn)實。
名稱,文件和地方
插件名
你得先想一個名字,并且努力讓它獨一無二。在 Plugins 或者其他寶貝地方——Google或者百度先驗證一下這個名字到底是不是獨一無二的。另外你的名字得讓別人明白你的插件是干什么的。
插件文件
下一步是創(chuàng)建一個PHP文件。按照原文奇怪的邏輯,你得先想好名字。這個名字還得是從插件名衍生過來的(其實是為你自己辨認的)。舉個例子吧,比如說你的插件名字叫 "Fabulous Functionality",你的PHP名字可能是 fabfunc.php。另外不要用漢語拼音(這也是我加的),還要避免重名。人民群眾會把你的插件安裝到一個你也知道的叫wp-content/plugins/的地方,如果名字沖突豈不要悲劇了。
你也可以選擇把插件分割成幾個文件。 顯而易見一個php文件是必需的,同時還需要圖片、CSS、JavaScript、語言(當然也可以沒有)。如果有很多文件,命名一個php和一個文件夾,例如 fabfunc and fabfunc.php。把你所有插件文件放到文件夾里,然后讓你的用戶相信只要把你的整個壓縮包解壓到 wp-content/plugins/就能正常使用你的勞動成果。
在本文的其余部分,“插件的PHP文件”是指主要插件的PHP文件,無論是在的wp-content/plugins/或子目錄。
Readme文件
如果你想將你的插件發(fā)布到https://wordpress.org/extend/plugins/, 你必須在插件包中建立一個標準格式readme.txt文件. 文件格式參見https://wordpress.org/extend/plugins/about/readme.txt.
主頁
最好為插件建立一個主頁,以介紹插件的功能、安裝方法、使用說明、適用的WordPress版本、插件更新信息等。
文件Headers
現(xiàn)在開始吧,首先讓我們從向PHP主文件中加入一些信息
標準插件信息
插件的主文件頂部必須包括一個標準插件信息頭。WordPress通過標準信息頭識別插件的存在,并把她加入到控制面板的插件管理頁面,這樣插件才能激活,載入插件,并運行里面的函數(shù);如果沒有信息頭,插件將無法激活和使用。標準信息插件頭的格式為:
<?php
/*
Plugin Name: 插件名
Plugin URI: 插件的介紹或更新地址
Description: 插件描述
Version: 插件版本,例如 1.0
Author: 插件作者名稱
Author URI: 插件作者的鏈接
License: A "Slug" license name e.g. GPL2
*/
?>
標準信息頭至少要包括插件名稱,這樣WordPress才能識別你的插件。其他信息將顯示在控制面板插件管理頁面中。標準插件信息對各行順序沒有要求。
這樣的升級機制能夠正確地讀出你的插件版本,建議你選擇一個格式的版本號,不同版本之間,并堅持下去。例如,x.x中或x.x.x或xx.xx.xxx
注意:文件必須是 UTF-8 格式!
版權(quán)信息
通常我們還要在標準信息頭中加入插件的許可證信息。大多數(shù)插件使用GPL或GPLCompatibleLicenses許可。如果使用GPL許可,要求插件中包含以下信息:
<?php
/* Copyright 年份 作者名 (email : 你的郵箱)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
?>
開始編寫插件
現(xiàn)在是時候讓你的插件能干些什么了。這部分內(nèi)容包括插件開發(fā)的一般思路,而且介紹了開發(fā)插件需要做哪些工作。
WordPress插件鉤子
許多WordPress插件通過連接一個或多個WordPress插件鉤子來完成他們的功能。插件鉤子的運行機理是,當WordPress運行到不同階段,WordPress會檢查當前階段是否注冊了插件函數(shù),如果是,那么函數(shù)將被執(zhí)行。通過執(zhí)行插件函數(shù)改變了WordPress的默認功能。
例如,在WordPress將日志標題和post發(fā)送到瀏覽器前,會檢查是否有插件函數(shù)注冊了名為“the_title”的“filter”鉤子。如果是,標題文本將會傳送到注冊函數(shù)中,注冊函數(shù)返回值將會傳送到瀏覽器。所以,如果要在日志標題中加入一些信息,可以通過這種方式實現(xiàn)。
另一個例子是名為“wp_footer”的“action”鉤子。在WordPress的HTML頁腳創(chuàng)建之前,會檢查是否有插件注冊了名為“wp_footer”的“action”鉤子,如果是依次執(zhí)行她們。
在Plugin API了解更多如何注冊“filter”和“action”類型的鉤子函數(shù),及WordPress提供了那些插件鉤子。如果你發(fā)現(xiàn)WordPress沒有提供自己想要的鉤子,你可以建議WordPress加入這個鉤子,很多建議WordPress都會采納。具體方法參考Reporting Bugs。
模版標簽
另一個通過插件加入新功能的方法是建立自定義的模版標簽Template Tags。如果有人想用你的插件,可以在他們的主題中添加這些標簽,邊欄,文章內(nèi)容段,或者任意的只要是適合這插件的地方。例如,一個給文章添加地理位置的插件可能定義了一個模板標簽函數(shù)geotag_list_states()放在邊欄上,這里列表了所有在文章中關(guān)聯(lián)的州的名稱,并且還帶有插件提供的到這些州的文檔頁的鏈接。
定義一個自定義模板標簽,僅需要寫一個PHP函數(shù),并且在你插件主頁或者插件的主PHP文件中聲明一下。聲明函數(shù)的時候,為這個函數(shù)提供一個示例來明確如果想要應(yīng)用這個函數(shù)需要加主題中加些什么文件是個相當棒的主意。
保存插件數(shù)據(jù)到數(shù)據(jù)庫
大多數(shù)WordPress插件需要站點的所有者或者是博客的用戶輸入信息,然后在對話過程中保存起來,以便過濾器函數(shù)(filter)、動作函數(shù)(action)或者模板函數(shù)(Template)使用。這些信息必須保存在WordPress的數(shù)據(jù)庫中,以便下次使用。這里有兩種基本的方法用于保存插件的信息到數(shù)據(jù)庫里面。
- 使用WordPress的"option"機制(稍后會有介紹)。這種方法適合于保存一些相對小數(shù)量的靜態(tài)命名類數(shù)據(jù)–這類數(shù)據(jù)通常只需要網(wǎng)站的所有者在首次建立插件的時候輸入,以后很少改動。
- 文章屬性post meta(a.k.a. Custom Fields),適用于那些只和個人文章、頁面或者附件有關(guān)的數(shù)據(jù)。
- 參看post_meta Function Examples, add_post_meta(), 以及與文章相關(guān)函數(shù)屬性post.fuction meta (a.k.a. Custom Fields).
- 自定義分類法。對于文章分類或者其他對象,比如用戶、評論,或者用戶可編輯列表中的數(shù)據(jù)名稱/值,可以考慮使用自定義分類法,尤其是當你要訪問的所有的文章/對象與給定的分類法項目相關(guān)聯(lián)的時候。查閱 Custom Taxonomies
- 在數(shù)據(jù)庫中創(chuàng)建一個新的自定義數(shù)據(jù)表。這種方法適合于與個人文章、頁面、附件或者評論相關(guān)的數(shù)據(jù),這類數(shù)據(jù)會隨著時間越來越多,它們也沒有專有名稱。參看Creating Tables with Plugins來了解更多這類信息處理方法。
WordPress的選項機制
參看 Creating Options Pages 得到更多如何創(chuàng)建會自動保存你選項數(shù)據(jù)的頁面。
WordPress擁有一個機制來保存,更新和檢索WordPress數(shù)據(jù)庫中專用,名稱類數(shù)據(jù)(即"options"機制)。選項值可以是字符,數(shù)組或PHP對象(他們會被"序列化",或在存儲前轉(zhuǎn)換為字符,并在被檢索時解開序列)。選項名稱是字符,并且它們必須是獨一無二的,這樣就不會與其它的WordPress插件相沖突。
它也通常被認為是一個不錯的主意,將你的插件使用的選項的數(shù)量降到最低。例如,考慮存儲序列化數(shù)組的10個元素作為一個單一的命名選項,而不是存儲10個不同的命名選項。
這里是你的插件應(yīng)用WordPress option功能的主要函數(shù)。
add_option($name, $value, $deprecated, $autoload);
- 建立一個新的option; 如果這個option已經(jīng)存在則不做動作.
- $name
- 必須 (string). 要添加的option的名稱.
- $value
- 可選(string), 默認是空字符. option值會存在這里.
- $deprecated
- 可選 (string), 不再被WordPress使用了,你可以不填或NULL 如果你希望應(yīng)用后面的$autoload參數(shù).
- $autoload
- 可選, 默認為 ‘yes’ (enum: ‘yes’ or ‘no’). 如果設(shè)置為 ‘yes’ 那么這個option會被get_alloptions 函數(shù)自動檢索.
get_option($option);
- 在數(shù)據(jù)庫中檢索option值.
- $option
- Required (string). 你想返回數(shù)值的option名稱。你可以Option Reference在找到一個隨著WordPress一起安裝好的默認option表。
update_option($option_name, $newvalue);
- 更新或創(chuàng)建數(shù)據(jù)庫中的option值(注意 add_option 不是必須被調(diào)用,如果你不想作用 $deprecated 或$autoload 參數(shù)).
- $option_name
- 必須(string). 要更新的option名.
- $newvalue
- 必須. (string|array|object) option的新值.
管理面板
假定你的插件有一些選項(option)存儲于WordPress的數(shù)據(jù)庫中(參看上一節(jié)),你可能會想要一個主控面板來允許你的插件用戶查看和編輯選項值。實現(xiàn)這一目標的方法闡述于Adding Administration Menus。
插件國際化
在你完成了你的插件的編寫工作之后,另一個需要考慮的問題(假設(shè)你準備跟大家分享你的插件的話)就是將其國際化。國際化就是將你的軟件設(shè)置成能夠本地化的過程;本地化是將軟件中顯示的語言翻譯成其他語言的過程。Wordpress正在被全球的人們使用,所以全球化和本地化是他內(nèi)在的特性,這其中就包括了插件的本地化。
請注意,插件的語言文件是不會自動加載。將此插件代碼,以確保加載的語言文件:
load_plugin_textdomain('your-unique-name', false, basename( dirname( __FILE__ ) ) . '/languages' );
要簡單地取一個字符串使用 __(‘String name’,’your-unique-name’); 返回翻譯或者 _e(‘String name’,’your-unique-name’); 輸出翻譯。翻譯,然后進入你插件的 /languages 文件夾。
我們十分希望你能夠?qū)⒛愕牟寮H化,這樣其他國家的用戶就可以在自己的本地使用它了。我們有一個關(guān)于國際化的綜合說明在I18n for WordPress Developers,這其中就包括了一個描述插件國際化的部分。
更新你的插件
本節(jié)介紹將插件托管到 https://wordpress.org/extend/plugins 之后必要的更新步驟。特別列出wordpress.org關(guān)于使用 Subversion(SVN)的一些細節(jié)。
假設(shè)你已經(jīng)提交你的插件到WordPress的插件庫,隨著時間的推移,你可能會發(fā)現(xiàn)需要將某些功能添加到插件或修正錯誤。更新代碼,并將變化提交到你的插件主干(trunk),這些變化將是公開可見的,但僅限于在技術(shù)上志同道合的人通過SVN檢查你的插件。其他用戶通過網(wǎng)站或自己的WordPress插件管理下載都不會改變。
當你準備發(fā)布一個新版本的插件:
- 確保一切承諾和新版本的實際工作。注意所有版本的WordPress的插件支持,并嘗試與他們進行測試。不要只是測試新功能,也確保你不小心打破一些插件的舊功能。
- 更改主要的PHP文件頭注釋中的版本號為新的版本號。
- 更改readme.txt文件的“Stable tag”字段中的版本號。
- 在readme.txt文件中添加一個新的小節(jié)“changelog“,簡要介紹與最后一個版本相比,新版本有什么改變。這將列出的插件頁面上的“更新日志”選項卡。
- 提交這些更改。
- 創(chuàng)建一個新的SVN標記作為副本主干(trunk),遵循 this guide。
給系統(tǒng)一個運行兩三分鐘,然后檢查你的插件,看看更新是否一切正常,以及WordPress 是否提示插件有更新??(更新檢查可能有緩存,比如wordpress.org插件頁面或后臺安裝,所以這可能需要一些時間 —— 嘗試訪問“可用更新”頁面)。
故障排除:
- wordpress.org插件的頁面上仍然列出舊版本。你是否更新了樹干文件夾’stable tag’ 字段?只創(chuàng)建一個標簽和或更新readme.txt文件是不夠的!
- 插件的頁面提供了一個zip文件的新版本,但按鈕仍然列出舊的版本號,而且WordPress 沒有裝更新通知。你是否已修改主要的PHP文件中“Version”版本號?
- 對于其他問題,請參考: The Plugins directory and readme.txt files
插件開發(fā)建議
最后這個部分是關(guān)于開發(fā)插件的一些建議。
- WordPress插件的代碼應(yīng)該遵循 WordPress Coding Standards. 另外請同時參考Inline Documentation。
- 你的插件中所有函數(shù)的名稱都應(yīng)該與現(xiàn)存的Wordpress Core函數(shù),其他插件或主題的任何名稱不同。基于這個原因,我們建議你在你的插件的所有函數(shù)的名稱之前加上一個你自己選擇的前綴,或者把你的插件的函數(shù)都寫在一個類里面(當然這個類的名字也必須是唯一的)。
- 請不要把Wordpress數(shù)據(jù)庫表格前綴(通常是“wp_”)直接寫在你的插件里,請使用$wpdb->prefix 。
- 雖然數(shù)據(jù)庫的讀取相對便宜,但它的寫入是相當昂貴的。數(shù)據(jù)庫十分擅長獲取信息并呈現(xiàn)給用戶,而且這些操作(通常)是非常迅速的。然而對數(shù)據(jù)庫進行改動就是一個非常復(fù)雜的過程了,而且需要使用更長的計算時間。因此,請盡量減少你對數(shù)據(jù)庫進行寫入的次數(shù)。在你編寫程序的時候就做好所有的準備,這樣就可以只在必須的時候再進行寫入了。
- 在數(shù)據(jù)庫里只SELECT你需要的東西。盡管數(shù)據(jù)庫的讀取十分便捷,我們依然推薦你值查找真正需要的數(shù)據(jù),來盡量減少數(shù)據(jù)庫的負載。例如,如果你只想獲得表格的行數(shù),不要使用 SELECT * FROM, 因為這樣的話每一行中的所有數(shù)據(jù)都會被讀出,導(dǎo)致內(nèi)存的浪費。同樣的,如果在插件中你只想獲得post_id和post_author,請只 SELECT 這兩項來減少數(shù)據(jù)庫的負載。記住:在某一個操作的同時可能有其他上百個進程需要使用數(shù)據(jù)庫,而數(shù)據(jù)庫和服務(wù)器都必須同時滿足所有這些進程的需求。學習怎樣盡量減少你的插件對數(shù)據(jù)庫的使用可以避免對這些資源的濫用。
- 不要讓你的PHP出錯。在你的wp_config.php文件中添加define(‘WP_DEBUG’,true);,對你的所有函數(shù)進行測試來確定是否有任何的錯誤或者警告。有多少,就修復(fù)多少,直到再也不出現(xiàn)為止。
- 盡量不要直接調(diào)用<script>和<style>標記 —— 推薦使用 wp_enqueue_style() 和 wp_enqueue_script() 函數(shù)。他們幫助消除引用重復(fù)的腳本和樣式,以及引進依賴的支持。
- 原文:http://codex.wordpress.org/Writing_a_Plugin
- 編譯:倡萌@WordPress大學 (參考官方中文文檔)





謝謝,非常不錯的教材。收藏下
官方是有中文版本的,和你翻譯的也差不離。你這個是自己翻譯的額。辛苦了。
我也打算學習制作wp插件,先從學習基本知識開始,不知道能否堅持到學會:)
如果想簡單的制作一個插件,讓一段代碼在頭部里加入,另一段代碼在評論代碼出現(xiàn)前加入,應(yīng)該如何制作呢?能否簡單地制作一個示例讓我研究研究呢?
我想開啟插件的時候,在前臺就可以顯示出一些html,應(yīng)該得咋弄?
正想學這方面的東西,收藏了
不設(shè)置debug應(yīng)該也行,PHP有錯,頁面是通不過的。
其實開發(fā)完以后,建議開啟debug檢測,你會得到一些比較常見的錯誤信息,比如是否使用了一些過時的函數(shù)、代碼參數(shù)是否嚴謹?shù)鹊?/p>
倡萌你好,有沒有做過wordpress短信接口或者wordpress短信下發(fā)驗證碼手機注冊的功能的案例?有沒有這方面的思路呢,請教一下啊
不好意思,沒有這方面的開發(fā)經(jīng)驗