>本文著重介紹了“鉤子”的應用程序接口,這里的鉤子又被稱為“過濾器”和“動作”。WordPress通過鉤子來運行插件。這些鉤子也可以用在主題中,WordPress中插件開發人員可以使用的API(應用程序接口)鉤子(hook)進行擴展開發
## **鉤子,動作與過濾器**
> WordPress用鉤子將插件“勾進”WordPress系統中,讓插件與WordPress相連接。也就是說,通過鉤子,WordPress能夠在特定時間內調用插件中的函數,讓插件開始運行。下面是鉤子的兩種形式:
> 1. 動作(Actions):在系統運行的某些特定時間點或發生特定事件時,WordPress核心程序會調用一些鉤子。這里WordPress所調用的鉤子被稱為“動作”。插件用動作API來指定在上述特定時間點內需要執行的PHP函數。
> 2. 過濾器(Filters):WordPress將不同類型文本添加到數據庫或發送給瀏覽器窗口前,需要調用一些鉤子來修改上述不同類型文本。這里WordPress所調用的鉤子被稱為“過濾器”。通過使用濾器API,插件可以執行一個或多個PHP函數以修改上述不同類型文本。
>有時我們可以直接通過動作或過濾器實現以上效果。例如,如果我們希望用插件來改變某篇日志內容,可以為publish_post添加一個動作函數(保存到數據庫時修改日志),也可以為the_content添加一個過濾器函數(顯示到瀏覽器窗口時修改日志)。
##**函數引用**
**過濾器函數**
* has_filters
* add_filter()
* apply_filters()
* current_filter
* merge_filters()
* remove_filter()
* remove_all_filters
**動作函數**
* has_action
* add_action
* do_action
* do_action_ref_array
* did_action
* remove_action
* remove_all_actions
**動作**
動作由發生在WordPress中的特定事件觸發,如發表日志、更改主題、顯示控制板頁面等。插件以執行PHP函數的方式來響應該事件,函數的作用可能是:
更改數據庫資料
發送電子郵件消息
更改瀏覽器窗口上顯示的信息(網站管理員或終端用戶)
基本步驟如下(下文中有詳細介紹):
1. 在插件文件中創建一個可以在事件發生時執行的PHP函數
2. 調用add_action,將動作函數勾入WordPress
3. 將創建的PHP函數存放在插件文件中,激活該函數
**創建動作函數**
要在插件中新建一個動作函數,首先要用插件中該動作的功能來創建一個PHP函數,然后將函數存入插件文件(我們需要將插件文件放在wp-content/plugins目錄下)。例如,如果我們希望每次我們發表新日志,博客都會以電子郵件的方式通知我們的朋友,我們可以定義以下函數:
~~~
function email_friends($post_ID) {
$friends = 'bob@example.org,susie@example.org';
mail($friends, "sally's blog updated",
'I just put something on my blog: http://blog.example.com');
return $post_ID;
}
~~~
大多數動作函數都能接受一個參數(通常是日志ID或評論ID,取決于動作的性質)。有些動作函數能接收更多參數——更多信息請參照動作的說明文檔或WordPress源代碼。除參數外,我們也可以獲取WordPress的全局變量,調用其它WordPress函數(或插件文件中的函數)。
函數輸出的內容會出現在調用動作的頁面源代碼中。
注意:其它插件或WordPress核心文件中的函數可能已經使用了我們所創建的函數名稱。
## **勾入WordPress(連接到WordPress程序中)**
定義PHP函數后,我們要將函數連接到WordPress中。可以在插件文件的全局變量執行域中調用add_action來實現連接:
**add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );**
其中:
**hook_name**
WordPress動作鉤子的名稱,通過名稱我們可以了解到函數與什么事件相關聯。
**your_function_name**
hook_name指定事件后,需要執行的函數名。函數需要是WordPress核心文件中的標準PHP函數,或是我們在插件文件中定義的函數(如上文中定義的'email_friends')。
**priority**
用一個可選的整數型變量來規定函數(與特定動作相關聯)的執行順序,變量值默認為10。若某函數的priority值小于10,優先執行該函數。如果若干函數priority值相等,則按加入動作的順序執行函數。
**accept_args**
用一個可選的整數型變量來定義函數能夠接受的參數數量(默認值為1)。有些鉤子能夠向函數傳遞一個以上參數,因此accept_args實用價值較大。參數引進于WordPress 1.5.1。
根據上面的例子,我們要在插件文件中加入以下代碼行:
**add_action ( 'publish_post', 'email_friends' );**
同樣,我們也可以刪除動作鉤子中的動作。
**安裝與激活**
最后我們要安裝文件、激活插件以運行動作鉤子。我們要將創建的PHP函數和add_filter調用存入一個PHP文件并將該PHP文件安裝在wp-content/plugins目錄下。安裝完畢后,在WordPress的管理界面中激活插件;參見管理插件。
**當前動作鉤子**
插件API/常用動作(action)中列出了WordPress現有動作鉤子以及之前WordPress版本的鏈接。
**過濾器(Filters)**
過濾器是WordPres在運行中的特定時間點、對數據進行操作(如將數據加入數據庫,或將數據發送到瀏覽器窗口上)前,用來傳遞數據的函數。WordPress生成頁面時,過濾器位于數據庫和瀏覽器之間;當WordPress將新日志和評論加入到數據庫中時,過濾器位于瀏覽器和數據庫之間。WordPress中大多數輸入和輸出內容都至少經過一個過濾器的傳遞。默認情況下WordPress會執行一些過濾行為,但插件也可以添加自己的過濾器函數。
將過濾器函數加入WordPress的基本步驟如下(下文中有詳細描述):
1. 創建一個可以過濾數據的PHP函數
2. 調用add_filter(),將過濾器函數勾入WordPress
3. 將創建的PHP函數存放在插件文件中,激活該函數
**創建過濾器函數**
過濾器函數將未經修改的數據作為輸入內容,返回修改后的數據(有時會返回空值來表示該數據應該被刪除或忽略)。如果過濾器函數沒有對數據做修改,則應該返回原始數據,方便插件必要時修改數據值。
因此要在插件中新建一個過濾器函數,首先要創建一個PHP函數負責過濾,然后將該PHP函數存入插件文件(插件文件必須位于wp-content/plugins目錄下)。例如,如果希望我們的日志和評論中沒有褻瀆性語言,我們需要定義一個全局變量,列出所有不允許出現的詞語,然后創建PHP函數:
`
function filter_profanity($content) {
global $profanities;
$content=str_ireplace($profanities,'{censored}',$content);
return $content;
}
`
為什么這里不用循環也可以?這是因為$profanities是一個數組,str_replace可以幫我們循環該數組。
注意:其它插件或WordPress核心文件中的函數可能已經使用了我們所創建的函數名稱。
**將過濾器勾入WordPress(連接到WordPress程序中)**
定義PHP函數后,我們要將過濾器函數連接到WordPress中。可以在插件文件的全局變量執行域中調用add_filter來實現連接:
**add_filter ( 'hook_name', 'your_filter', [priority], [accepted_args] );**
其中:
**hook_name**
WordPress過濾器鉤子的名稱,通過名稱我們可以了解到什么時候需要用到過濾器函數。
**your_function_name**
用于過濾的函數的名稱。函數需要是WordPress核心文件中的標準PHP函數,或是我們在插件文件中定義的函數。
**priority**
用一個可選的整數型變量來規定函數(該函數與特定過濾器相關聯)的執行順序,變量值默認為10。若某函數的priority值小于10,優先執行該函數。如果若干函數priority值相等,則按加入過濾器的順序執行函數。
**accept_args**
用一個可選的整數型變量來定義函數能夠接受的參數數量(默認值為1)。有些鉤子能夠向函數傳遞一個以上參數,因此accept_args實用價值較大。
根據上面的例子,我們要在插件文件的主執行區域中加入以下代碼行,讓WordPress過濾含有褻瀆性內容的評論:
**add_filter('comment_text','filter_profanity');**
我們也可以用remove_filter()刪除過濾器鉤子中的過濾器函數。
**安裝與激活**
最后我們要安裝文件、激活插件以運行過濾器鉤子。我們要將創建的PHP函數和add_filter調用存入一個PHP文件并且將該PHP文件安裝在wp-content/plugins目錄下。安裝完畢后,在WordPress的管理界面中激活插件;參見管理插件。
**當前過濾器鉤子**
插件API/常用動作(action)中列出了WordPress現有過濾器鉤子以及之前WordPress版本的鏈接。
**示例**
這是wp-hackers郵件列表中的一個示例。該示例用一個插件來更改(或重寫)默認的bloginfo()函數。這將會修改核心函數。
~~~
add_filter('bloginfo', 'mybloginfo', 1, 2);
add_filter('bloginfo_url', 'mybloginfo', 1, 2);
function mybloginfo($result='', $show='') {
switch ($show) {
case 'wpurl':
$result = SITE_URL;
break;
case 'template_directory':
$result = TEMPL_DIR;
break;
default:
}
return $result;
}
~~~
**刪除動作和過濾器**
有時我們可能會希望插件禁用WordPress內置的、或者其它插件創建的某個動作或過濾器。這時可以調用remove_filter('filter_hook','filter_function')或remove_action('action_hook','action_function')幫助我們達到期望的效果。
例如發表新日志時,用remove_action('publish_post','generic_ping'); 可以阻止博客發送ping。
注意,如果鉤子優先級的值不是10,那么我們必須在調用remove_action時指定優先級。一般來說,除非我們完全了解所要刪除的信息以及信息的作用,否則不能隨意刪除任何信息——可以查看WordPress源代碼或者其它插件源代碼以了解信息。
**可插入式函數**
除了上面介紹的鉤子(動作和過濾器),我們還可以通過重寫WordPress函數來讓插件影響WordPress的運行。事實上,WordPress為插件提供了一個能夠重新定義的小型函數集。函數集中的函數被稱為可插入式函數,存儲在wp-includes/pluggable.php下。如果所有插件都加載完畢后,可插入式函數仍然處于未定義狀態,這時WordPress會加載這些函數。
- 模板制作
- 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開發組對于前端提交文件的要求