Hook是WordPress提供的,允許你的插件“勾入”WordPress的程序,或者說,可以在特定時候執行你插件中的函數,從而使得你的插件執行。這裏提供了兩種hook:
- Action:Action(動作)是WordPress程序核心在程序執行的特殊點(特定事件發生)加載的。使用Action API,你的插件可以在這些特殊點執行一個或者多個在插件中編寫的PHP函數。
- Filter:Filter(過濾器)是WordPress加載的,當文本被存入數據庫或發送到瀏覽器之前,Filter可用來對其進行多種類型的處理。使用Filter,你的插件可以使用定義在其中的PHP函數來對文本進行多種處理。
-
編寫Action函數
在插件中創建Action的第一步是在插件中編寫一個實現Action功能的PHP函數並且將其放入你的插件文件(插件文件必須放置在wp-content/plugins目錄)中。比如,如果你希望當發表一篇日誌後,發送Email通知給你的朋友,那麼你可以定義如下函數:
function email_friends($post_ID) {
$friends = '[email protected],[email protected]';
mail($friends, "sally's blog updated",
'I just put something on my blog: http://blog.example.com');
return $post_ID;
}在大多數Action中,你的函數應該接受一個參數(通常是日誌或者帖子的編號,這取決於你要進行的操作)。某些Action可能有多餘一個參數--你可以通過查看Action的文檔或者WordPress源代碼來獲得更多信息。除函數參數外,你還可以訪問WordPress的全局變量以及執行WordPress中定義的其他函數(或者在你的插件文件中定義的函數)。
注意:切記其他插件或者WordPress核心可能已經使用了你希望使用的函數名稱,你可以瀏覽Avoiding Function Name Collisions(避免函數名稱衝突--譯者注)來獲得更多信息。
Hook(勾入)到WordPress
完成你的函數的編寫後,下一步就是將其hook(勾入)或者說註冊到WordPress中,你可以通過執行全局空間中的add_action()函數來實現,如:
add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );
此處
- hook_name參數是WordPress提供的Action Hook(動作鉤子)名稱,這決定了你的函數應當和哪個事件結合。
- your_function_name參數是你希望在特定事件(即hook_name參數指定的事件)後執行的函數名稱。該函數可以是標準的PHP函數,在WordPress核心中定義的函數或者你自己在插件文件中定義的函數(如剛纔我們編寫的emai_friends函數)。
- priority參數是一個可選的整型參數,他用來指明在結合特定事件的多個函數中,當前函數被執行的順序(默認爲10)。該參數指定的更小的數字會被更早的執行,priority參數相同的函數會依照他們被加入Action的順序來執行。
- accepted_args參數是一個可選的整型參數,他定義了你的函數中可以接收多少個參數(默認爲1)。該參數是非常有用的,因爲某些Hook可以向你的函數中傳入多個參數。該參數在1.5.1版本中被新加入。
在前面的例子中,我們可以在插件文件中加入如下代碼:
add_action('publish_post', 'email_friends');
同樣的,你也可以在Action Hook中移除Action,你可以參考Remove Actions來獲得更多詳情。
Filters(過濾器)
Filters(過濾器)是WordPress在執行中的特定點傳遞數據的函數,他發生在對數據進行操作(如將其加入數據庫或發送到瀏覽器)之前。Filter建立在數據庫到瀏覽器之間的處理(當WordPress生成頁面時),同時也建立在瀏覽器到數據庫之間的處理(當WordPress新增日誌或者評論到數據庫時);多數WordPress中的輸入輸出都通過了至少一個filter。WordPress默認已經實現了一些過濾操作,你的插件也可以加入你自己的過濾操作。
將你的filter加入WordPress中的基本步驟如下:
- 編寫用於過濾數據的PHP函數。
- 通過執行add_filter函數將filter Hook(勾入)到WordPress。
- 將你的PHP函數放入插件文件,並且將其激活。
編寫Filter(過濾器)函數
Filter(過濾器)函數獲得未經修改的數據,並返回修改後的數據(或者在某些情況下,返回null值來標識數據應當被刪除或忽略)。如果你的filter不修改數據,那麼應當返回原始數據,這樣,如果必要,其餘的插件可以繼續修改數據。
因此,在你的插件中創建filter的第一步是編寫一個PHP函數來進行過濾處理,並且將其放在你的插件文件(插件文件必須放置在wp-content/plugins目錄)當中。例如,如果你希望確保你的帖子和評論中不包含髒話,你可以定義一個存放禁止詞彙的全局變量,然後編寫如下的PHP函數:
function filter_profanity($content) {
global $profanities;
foreach($profanities as $profanity) {
$content=str_ireplace($profanity,'{censored}',$content);
}
return $content;
}注意:切記其他插件或者WordPress核心可能已經使用了你希望使用的函數名稱,你可以瀏覽Avoiding Function Name Collisions(避免函數名稱衝突--譯者注)來獲得更多信息。
Hook(勾入)到WordPress
完成你的函數的編寫後,下一步就是將其hook(勾入)或者說註冊到WordPress中,你可以通過執行全局空間中的add_filter()函數來實現,如:
add_filter('hook_name', 'your_filter', [priority], [accepted_args]);
此處:
- hook_name參數是WordPress提供的Filter Hook(過濾器鉤子)名稱,這決定了你的函數在何時發揮作用。
- your_filter參數是你希望用來過濾的函數的名稱。該函數可以是標準的PHP函數,在WordPress核心中定義的函數或者你自己在插件文件中定義的函數。
- priority參數是一個可選的整型參數,他用來指明在結合特定事件的多個函數中,當前函數被執行的順序(默認爲10)。該參數指定的更小的數字會被更早的執行,priority參數相同的函數會依照他們被加入Action的順序來執行。
- accepted_args參數是一個可選的整型參數,他定義了你的函數中可以接收多少個參數(默認爲1)。該參數是非常有用的,因爲某些Hook可以向你的函數中傳入多個參數。該參數在1.5.1版本中被新加入。
-
刪除Action和Filter
在某些情況下,你會發現你希望你的插件屏蔽WordPress內建或者其他插件加入的Action或Filter。你可以通過執行
remove_filter('filter_hook','filter_function')函數或者remove_action('action_hook','action_function')函數來實現。
舉例來說,remove_action('publish_post','generic_ping');會使得你在發表新日誌時不發送日誌引用(ping)。
注意如果某個hook在註冊時使用了除默認值10意外的priority參數,則你必須修改在remove_action()函數中的priority參數。同時也請注意,通常來講除非你知道這樣做的原因和後果,你不應當移除任何東西--請檢查WordPress或者其他插件的源代碼來保證這一點。
默認應用的Filter和Action
找出WordPress默認啓用的filter和Action的最可靠方法是在WordPress核心文件中搜索 add_filter和add_action。
WordPress 2.1
在WordPress 2.1中,大多數默認filter和action是通過文件wp-includes/default-filters.php來加入的,少數其他的在如下文件中被加入:
- wp-admin/admin-ajax.php
- wp-admin/admin-functions.php
- wp-admin/custom-header.php
- wp-admin/edit.php
- wp-admin/index.php
- wp-admin/options-permalink.php
- wp-admin/upload-functions.php
- wp-admin/upload.php
- wp-includes/bookmark.php
- wp-includes/general-template.php
- wp-includes/kses.php
- wp-includes/plugin.php
- wp-includes/rewrite.php
- wp-includes/template-loader.php
- wp-includes/theme.php
http://www.ashuwp.com/courses/level/simple -
http://blog.wpjam.com/2007/11/09/write-plugin-by-yourself-begin/