WordPress 的外掛機制實際上只的就是這個 Hook 了,它中文被翻譯成鉤子,允許你參與 WordPress 核心的執行,是一個非常棒的東西,下面我們來詳細瞭解一下它。
PS:本文只是簡單的總結一下,更多用法還是要參考文中給出的函式。
鉤子分類
鉤子分為兩種,一種叫做動作 (action),還有一種叫做過濾器 (filter) 。這兩種鉤子實現原理基本一樣,後邊會講到,使用上的區別在於過濾器有返回值,而動作沒有。
動作的理念是讓你在一種情況或者一個特別的位置執行一些函式,比如傳送一封郵件等;過濾器則是讓你修改 WordPress 核心需要用到的一個值,然後 WordPress 再用這些值做一些事情,比如函式的返回值等。
動作鉤子
wp_head 是一個很常用的動作鉤子,在開發主題過程中,開發者都會在 head 標籤里加上 wp_head() 函式,事實上,正是這個函式呼叫了 wp_head 鉤子。
如果外掛開發者想要在 head 標籤裡新增一句話,就可以使用 wp_head 鉤子,下邊是個簡單的例子。
|
//在 head 標籤新增一些內容 functionBing_add_head_tag(){ echo'新增內容'; } add_action('wp_head','Bing_add_head_tag'); |
新增程式碼後,檢視前臺的網頁原始碼,就能在 head 標籤裡看到我們新增的內容了。

上邊是一個簡單的例子,只是列印了一句話。利用這個鉤子,我們還可以做一個遇到 404 頁面給管理員傳送一封郵件的外掛,下邊簡單的寫了一個。
|
//遇到 404 頁面給管理員傳送郵件 functionBing_404_page_mail(){ if(!is_404())return;//如果不是 404 頁面就退出函式 $to=get_option('admin_email');//獲取管理員地址 $subject='遇到 404 頁面啦!';//郵件標題 $message='404 頁面的地址:http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];//郵件內容 wp_mail($to,$subject,$message);//傳送郵件 } add_action('wp_head','Bing_404_page_mail'); |
更多關於 add_action() 函式的內容:《 WordPress 函式:add_action()(新增動作) 》
過濾器鉤子
根據我的親身經歷,可能過濾器鉤子會難理解些,尤其對不熟悉 PHP 的人來說。
過濾器鉤子可以讓你改一些東西的值,過濾器回撥函式會接受一個引數,這就是當前的值。還記得那個用來呼叫文章內容的 the_content() 函式吧,這個函式就提供了一個 the_content 過濾器。
給 the_content 鉤子新增一個函式,這個函式需要接收一個引數,這個引數就是當前的值。
|
//文章內容全部連結新視窗開啟 functionBing_autoblank($content){//$content 變數就是文章內容,因為其它過濾器也要過濾,所以這個內容可能是經過其它函式過濾的 $content=str_replace('<a','<a target="_blank"',$content);//新增 target="_blank" return$content;//必須要把過濾後的內容返回回去,否則值就丟了 } add_filter('the_content','Bing_autoblank'); |
更多關於 add_filter() 函式的內容:《 WordPress 函式:add_filter()(新增過濾器) 》
呼叫鉤子
WordPress 核心是怎麼呼叫這些鉤子的就不再這篇文章了,可以參考下邊兩篇文章。
動作鉤子:《 WordPress 函式:do_action()(執行動作) 》
過濾器鉤子:《 WordPress 函式:apply_filters()(建立過濾器) 》
鉤子原理
事實上,在呼叫 add_action() 和 add_filter() 的時候,只是向 $wp_filter 全域性變數新增了一個陣列元素,還要說的就是動作和過濾器是公用的一個全域性變數,也就是說,過濾器和動作是不能重名的。
當呼叫 do_action() 的時候,會查詢 $wp_filter 全域性變數中都有哪些新增到此動作的函式,迴圈執行即可。
apply_filters() 比 do_action() 多了一個步奏,就是每次呼叫函式時還要接收這個函式的返回值,最後把經過多次過濾的值返回出去,供使用。