##**插件開發**
**簡介**
在WordPress博客上,用戶可以輕松實現對插件的更改、定制以及功能強化。用戶不必更改WordPress的核心程序就可以為WordPress插件添加各種功能。下面是對WordPress插件的簡單定義:
WordPress插件:WordPress插件是一個能夠擴展WordPress博客功能的PHP腳本程序或函數集。通過線路入口和WordPress插件API(應用程序接口),WordPress插件能夠實現與WordPress博客的無縫結合。
有時你是否希望WordPress能夠增加一些新功能,或者能夠修改其中某個功能?這時可以先查找不同WordPress插件庫以及各種插件資源,看是否已經有人開發了符合你需要的插件。如果沒有,那么請根據這篇文章的指導,開發一個屬于自己的WordPress插件吧。
**有關資料**
* WordPress插件的工作方式和安裝方法可參見插件。
* Plugin Resources為插件開發人員列出一份詳細的文章列表,包括一些介紹如何編寫WordPress插件以及特殊插件問題的外部文章。
* 要了解編寫WordPress插件的基本原理,可以參考優質插件的源代碼,例如WordPress發布的Hello Dolly。
* 插件開發完成后,根據插件提交和推廣中的操作說明發布自己開發的插件
**新建插件**
本部分內容向大家介紹了插件的各個開發步驟,以及要建立一個優質插件必須要考慮的一些問題。
**插件名稱、文件、位置**
**插件名稱**
開發插件時,首先要考慮到的就是插件的功能,以及為插件起一個好名字(插件名稱最好是獨一無二的)。事先檢查插件和其中提到的插件庫,確定自己的插件名稱的確是唯一的;當然也可以到Google上確認一下。大多數插件開發人員選擇插件名稱時都希望它能在一定程度上反映插件的功能;例如與天氣相關的插件,名字中可能就有“weather(天氣)”這個詞。一個插件名稱中可以包含很多個單詞。
**插件文件**
接下來我們需要創建一個PHP文件,根據插件名稱為該PHP文件命名。例如,如果插件名為“Fabulous Functionality”,PHP文件名可以是fabfunc.php。這里的文件名最好也是唯一的。用戶安裝了我們開發的插件后,這個PHP文件會被存儲在用戶安裝文件的WordPress插件文件夾wp-content/plugins/中,這樣一來各個插件的PHP文件名就不會有重復,用戶也無需費時尋找自己所要的PHP文件了。
另一種方法是將插件拆分為多個文件。我們開發的WordPress插件至少有一個PHP文件;插件中可能還包括JavaScript文件、CSS文件、圖片文件、語言文件等。如果插件由多個文件組成,文件夾和主PHP文件的名字應該是唯一的,例如在Fabulous Functionality插件中,文件夾名稱和主PHP文件名稱分別可以是fabfunc和fabfunc.php。將所有插件文件都放入文件夾中,通知用戶將整個文件夾存放在 wp-content/plugins/下。
在文章接下來的部分中,“插件PHP文件”即主插件PHP文件,無論該文件出現在 wp-content/plugins/或是子文件夾中。
**Readme文件**
如果希望將自己開發的插件放在`http://wordpress.org/extend/plugins/`下,我們還要按照標準格式為插件新建一個readme.txt文件,將文件包含在插件文件中。 `http://wordpress.org/extend/plugins/about/readme.txt`中詳細介紹了readme文件的格式。
**主頁**
創建一個網頁來作為插件的主頁也是個不錯的選擇。網頁中的內容應該包括插件的安裝方法、插件的功能、插件可兼容的WordPress版本、插件各個版本的修改記錄以及插件的具體用法等。
**文件頭**
現在我們要在主插件PHP文件中添加一些內容。
標準插件信息
插件的主PHP文件頂端中必須包括一個標準的插件信息頭。WordPress通過信息頭判斷該插件的存在。我們可以將信息頭放在插件管理界面中以激活信息頭,之后加載信息頭并運行信息頭中的函數;如果沒有信息頭,插件永遠不會被激活,WordPress也不可能運行插件。下面是信息頭的格式:
~~~
<?php
/*
Plugin Name: Name Of The Plugin
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: A brief description of the Plugin.
Version: The Plugin's Version Number, e.g.: 1.0
Author: Name Of The Plugin Author
Author URI: http://URI_Of_The_Plugin_Author
*/
?>
~~~
對WordPress來說,Plugin Name這一代碼行是絕對必要的,WordPress需要通過它來識別插件。其它行信息(如果插件提供了其它信息)則用于生成插件管理界面上的插件表單。代碼行順序不分先后,用戶可以自行排列。
**許可證**
用戶習慣于在標準信息頭中查找插件的許可證信息。大多數插件都使用WordPress所用的 GPL 許可證或一種能與GPL兼容的許可證。我們可以在插件中加入下列代碼以表明插件的GPL許可證信息:
~~~
<?php
/* Copyright YEAR PLUGIN_AUTHOR_NAME (email : PLUGIN AUTHOR 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
*/
?>
~~~
## **編寫插件**
接下來應該考慮插件的具體功用了。本部分內容包括插件開發的一些基本理論,同時也描述了怎樣完成插件需要進行的幾項任務。
**WordPress插件鉤子**
WordPress中很多插件會通過連接WordPress插件hook(鉤子)來實現各種效果。以下是WordPress插件鉤子的工作方式:在WordPress的不同運行時段,WordPress會檢查此時是否有插件記錄了需要運行的函數,如果有,WordPress會運行這些函數。這些函數改變了WordPress的默認運行狀態。
例如,WordPress將日志標題顯示到網頁上之前,會首先查看是否有插件為一個名為 "the_title"的過濾器鉤子記錄函數。如果有,被記錄的函數會解析日志標題,然后在網頁上顯示最終解析結果。因此,如果我們的插件需要在日志標題中加入一些信息,插件可以事先記錄 "the_title"過濾器函數。
這里另一個例子是一個名為"wp_footer"的動作鉤子。WordPress在所生成的HTML頁面尾部檢查是否有插件為"wp_footer"動作鉤子記錄函數,如果有,WordPress會逐個運行這些函數。
插件API中介紹了為過濾器鉤子和動作鉤子記錄函數的方法,以及WordPress中可用的插件鉤子。如果我們希望在WordPress代碼中的某個地方加入WordPress沒有的過濾器或動作,我們可以向WordPress團隊提出我們的意見(一般情況下WordPress團隊都會接受這些意見),意見提交過程參見提交Bugs。
**模板標簽**
WordPress插件還可以通過創建自定義的模板標簽來擴展WordPress的功能。有些用戶希望插件能夠將“標簽”添加到他們的主題、側邊欄、日志正文等適當的地方。例如,如果某插件能夠為日志添加地理標簽,該插件可以為側邊欄定義一個名為geotag_list_states()的模板標簽函數,讓側邊欄顯示出所有具有該標簽的日志的狀態,并且每個狀態都能鏈接到由該插件激活的、相同狀態的日志存檔頁面。
我們要定義某個自定義的模板標簽,只要在插件的主頁和/或插件主PHP文件上為用戶編寫一個PHP函數和相應的文檔說明就可以了。如果能在文檔說明中給出一個示例,準確說明需要添加到主題文件中的內容,對用戶來說就更方便了。
**將插件信息保存到數據庫中**
大多數WordPress插件都需要獲取一些網站管理員/博客用戶的輸入信息,然后保存這些信息,必要時用在過濾器函數、動作函數和模板函數中。為了保證信息的一致性,我們要把這些信息保存在WordPress的數據庫中。有幾種簡單方法可以將插件信息保存到數據庫中:
1. 使用WordPress的“設置”功能(下文有介紹)。存放少量相關靜態、特定數據類型(即首次設置插件時,我們所規定的網站管理員輸入的數據類型,設置之后基本不會被改動)時,可以采用這種方法。
2. 使用Post Meta (又稱自定義字段)。這種方法適用于單篇日志、頁面和附件相關數據。參見post_meta 函數示例,,add_post_meta,以及其它相關函數。
3. 創建一個全新的定制數據庫表。這個方法適用于與單篇日志、頁面、附件或者評論相關的數據,這種數據類型會隨著時間的推移而發展,沒有屬于自己的名稱。更多信息參見用插件創建數據庫表。
**WordPress設置功能**
如何創建一個可以自動保存用戶設置的頁面,請看創建選項頁面。
WordPress有一套自用機制,可以在數據庫中保存、更新、檢索個人信息以及規定數據塊(選項/設置)。這些選項值可以是字符串、數組或者PHP對象(這些PHP對象會被“序列化”,也可能在存儲前被轉換成字符串,檢索時再恢復被“序列化”前的狀態)。選項名稱由字符串組成,并且選項名稱必須是唯一的,這樣才不會與WordPress或其它插件相沖突。
插件可以用以下函數來獲取WordPress的選項。
add_option($name, $value, $deprecated, $autoload);
創建一個新選項;如果選項已存在,不進行其它任何操作。
**$name**
必需(字符串)。添加選項名稱。
**$value**
可選(字符串),默認值為空字符串。存儲選項值。
**$deprecated**
可選(字符串),WordPress已棄用該參數,用戶如果需要使用$autoload參數,可以為$deprecated傳遞一個空字符串或零。
**$autoload**
可選,默認值為'yes'(列舉類型:'yes'或'no')。若默認值為'yes',get_alloptions函數會自動檢索選項情況。
**get_option($option);**
從數據庫中檢索選項值。
**$option**
必需(字符串)。希望返回其值的選項名稱。在WordPress的常用選項中可以找到一個默認選項列表。
**update_option($option_name, $newvalue);**
在數據庫中更新或生成某個選項值(注意:如果不使用$deprecated或$autoload參數,就沒有必要調用add_option)。
**$option_name**
必需(字符串)。更新選項名稱。
**$newvalue**
必需。(字符串 | 數組 | 對象)選項的新值。
**控制面板**
假設目前插件中有些選項存儲在WordPress數據庫中(參見上文),這時我們可能需要創建一個管理界面,以便用戶查看、編輯插件的選項值。具體創建過程參見定制插件管理菜單。
**插件國際化**
插件編寫完畢后,接下來就應該考慮推廣插件了,我們可以將自己開發的插件國際化。首先要將插件本地化,然后再將插件翻譯成不同語言。WordPress遍及全球,因此WordPress結構本身以及插件都需要實現本地化、國際化。
將我們的插件翻譯成不同語言版本,讓不同國家的用戶都可以使用我們自己開發的插件,這也是一種插件推廣方法。I18n for WordPress Developers向讀者介紹了怎樣進行軟件國際化,其中一個版塊詳細描述了如何國際化WordPress插件。
**插件開發建議**
以下是一些關于插件開發的小建議。
* WordPress插件代碼應符合WordPress編碼標準,以及內嵌文檔規則。
插件中所有函數名稱都應該是唯一的,不能與WordPress核心文件、主題、其它插件中的函數名稱相沖突。因此,我們可以為插件中的函數使用獨一無二的函數名前綴。還可以在類(類名也應該是唯一的)中定義插件函數。
* 不要將WordPress數據庫表前綴(通常是"wp_")硬編碼到插件中,使用$wpdb->prefix變量來代替。
讀取數據庫數據非常方便,但為數據庫寫入數據卻有些困難。數據庫能夠快速獲取數據,然后將數據返回給用戶。但更改數據庫卻是一個很復雜的過程。因此我們要盡量將數據庫的寫入信息量減少到最低點。可以事先在代碼中準備好所有寫入數據,然后寫入數據庫時就方便多了。
* 即使數據庫存取數據的速度極快,我們也應該只向數據庫請求必要信息,不要為數據庫增加額外負擔。如果要計算某張表中的行數,不要使用SELECT * FROM,這會查找出所有行中的所有數據,占用內存。同樣的,如果插件只需要用到post_id和post_author,為了減少數據庫的負擔,我們也只需要選定這些指定字段。記住:同一時段可能還有很多其它程序需要調用數據庫。數據庫和服務器用有限的資源為計算機上所有程序服務。減少插件對服務器不必要的請求,可以保證這些資源能夠被更合理地利用。
* 清除插件中的PHP錯誤。在wp-config.php文件中添加define('WP_DEBUG', true); ,測試插件的所有功能,檢查插件是否出錯。如果有錯誤請及時修正并將插件標記為“debug”狀態,直到錯誤修正完畢。
- 模板制作
- wp的模板文件系統
- wp頭部代碼示例
- wp模板主體代碼
- WordPress各種標簽調用集合
- wordpress模板的各種調用
- wp模板里面的各種判斷
- wordpress非插件同步twitte
- 功能與擴展
- 獲取文章評論數及人數
- 獲取assets路徑
- 函數參數詳解
- wp_nav_nemu
- WordPress主題制作全過程
- 1、模板主體文件構成
- 2、HTML靜態模板制作
- 3、小試牛刀
- 4、制作header.php
- 5、制作footer.php
- 6、制作sidebar.php
- 7、制作index.php
- 8、制作sigle.php
- 9、制作comments.php
- 10、制作page.php
- 小知識
- 模板獲取js和css
- woocommerce
- woocommerce模板文件說明
- wp二次開發快速指南
- wp文件系統解析
- wordpress開發api之鉤子大全
- 在典型請求中運行的動作鉤子
- 日志、頁面、附件以及類別相關的動作鉤子函數
- 評論、Ping以及引用通告相關動作鉤子函數
- 反向鏈接鉤子
- Feed動作鉤子函數
- 模板動作鉤子
- 管理界面的相關動作函數
- 高級動作函數
- 常用函數之add_action
- 插件開發
- 函數大全
- 問題合集
- 獲取wordpress當前文件的模板文件
- 禁用wordpress gravatar使用本地頭像提高網頁打開速度
- woocommerce問題
- 關于cnzz的問題
- 關于wp搬家以后調用數據顯示為問號
- 未解決的問題
- form_control的問題
- 關于流程與要求的定義與補充
- php開發組對于前端提交文件的要求