當前位置:首頁>WordPress建站>WordPress開發(fā)>如何開發(fā)一個WordPress插件

如何開發(fā)一個WordPress插件

介紹

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ù)插件使用GPLGPLCompatibleLicenses許可。如果使用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ù)庫里面。

  1. 使用WordPress的"option"機制(稍后會有介紹)。這種方法適合于保存一些相對小數(shù)量的靜態(tài)命名類數(shù)據(jù)–這類數(shù)據(jù)通常只需要網(wǎng)站的所有者在首次建立插件的時候輸入,以后很少改動。
  2. 文章屬性post meta(a.k.a. Custom Fields),適用于那些只和個人文章、頁面或者附件有關(guān)的數(shù)據(jù)。
  3. 參看post_meta Function Examples, add_post_meta(), 以及與文章相關(guān)函數(shù)屬性post.fuction meta (a.k.a. Custom Fields).
  4. 自定義分類法。對于文章分類或者其他對象,比如用戶、評論,或者用戶可編輯列表中的數(shù)據(jù)名稱/值,可以考慮使用自定義分類法,尤其是當你要訪問的所有的文章/對象與給定的分類法項目相關(guān)聯(lián)的時候。查閱 Custom Taxonomies
  5. 在數(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大學 (參考官方中文文檔)
聲明:本站所有文章,如無特殊說明或標注,均為本站原創(chuàng)發(fā)布。任何個人或組織,在未征得本站同意時,禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關(guān)注WordPress大學公眾號 WPDAXUE
WordPress開發(fā)

WordPress函數(shù):add_action(添加動作)

2013-5-11 10:07:33

WordPress開發(fā)

WordPress Plugin API(插件接口)

2013-5-13 12:34:48

10 條回復(fù) A文章作者 M管理員
  1. 謝謝,非常不錯的教材。收藏下

  2. 官方是有中文版本的,和你翻譯的也差不離。你這個是自己翻譯的額。辛苦了。

  3. 我也打算學習制作wp插件,先從學習基本知識開始,不知道能否堅持到學會:)

  4. 如果想簡單的制作一個插件,讓一段代碼在頭部里加入,另一段代碼在評論代碼出現(xiàn)前加入,應(yīng)該如何制作呢?能否簡單地制作一個示例讓我研究研究呢?

  5. 我想開啟插件的時候,在前臺就可以顯示出一些html,應(yīng)該得咋弄?

  6. 正想學這方面的東西,收藏了

  7. 不設(shè)置debug應(yīng)該也行,PHP有錯,頁面是通不過的。

    • 其實開發(fā)完以后,建議開啟debug檢測,你會得到一些比較常見的錯誤信息,比如是否使用了一些過時的函數(shù)、代碼參數(shù)是否嚴謹?shù)鹊?/p>

    • 網(wǎng)站編輯

      倡萌你好,有沒有做過wordpress短信接口或者wordpress短信下發(fā)驗證碼手機注冊的功能的案例?有沒有這方面的思路呢,請教一下啊

    • 不好意思,沒有這方面的開發(fā)經(jīng)驗

?
個人中心
購物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

丰顺县| 新丰县| 贵阳市| 丹寨县| 陇南市| 衡阳市| 林芝县| 清水县| 荃湾区| 尉氏县| 万宁市| 贺州市| 通渭县| 施秉县| 彭州市| 高州市| 正阳县| 钟祥市| 聊城市| 桐乡市| 深圳市| 南阳市| 通许县| 镶黄旗| 嫩江县| 房产| 女性| 湘潭县| 扬中市| 弥勒县| 奉节县| 洛扎县| 荥阳市| 娄烦县| 闻喜县| 富民县| 鹤峰县| 望奎县| 广安市| 睢宁县| 剑河县|