WordPress 插件機制的簡單用法和原理(Hook 鉤子)

WordPress 的插件機制實際上只的就是這個 Hook 了,它中文被翻譯成鉤子,容許你參與 WordPress 核心的運行,是一個很是棒的東西,下面咱們來詳細瞭解一下它。html

PS:本文只是簡單的總結一下,更多用法仍是要參考文中給出的函數。數組

鉤子分類
鉤子分爲兩種,一種叫作動做(action),還有一種叫作過濾器(filter)。這兩種鉤子實現原理基本同樣,後邊會講到,使用上的區別在於過濾器有返回值,而動做沒有。app

動做的理念是讓你在一種狀況或者一個特別的位置執行一些函數,好比發送一封郵件等;過濾器則是讓你修改 WordPress 核心須要用到的一個值,而後 WordPress 再用這些值作一些事情,好比函數的返回值等。函數

動做鉤子
wp_head 是一個很經常使用的動做鉤子,在開發主題過程當中,開發者都會在 head 標籤里加上 wp_head() 函數,事實上,正是這個函數調用了 wp_head 鉤子。spa

若是插件開發者想要在 head 標籤裏添加一句話,就可使用 wp_head 鉤子,下邊是個簡單的例子。插件

//在 head 標籤添加一些內容
function Bing_add_head_tag(){
    echo '添加內容';
}
add_action( 'wp_head', 'Bing_add_head_tag' );

  

添加代碼後,查看前臺的網頁源代碼,就能在 head 標籤裏看到咱們添加的內容了。翻譯

上邊是一個簡單的例子,只是打印了一句話。利用這個鉤子,咱們還能夠作一個遇到 404 頁面給管理員發送一封郵件的插件,下邊簡單的寫了一個。code

 

//遇到 404 頁面給管理員發送郵件
function Bing_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()(添加動做) 》htm

過濾器鉤子
根據個人親身經歷,可能過濾器鉤子會難理解些,尤爲對不熟悉 PHP 的人來講。blog

過濾器鉤子可讓你改一些東西的值,過濾器回調函數會接受一個參數,這就是當前的值。還記得那個用來調用文章內容的 the_content() 函數吧,這個函數就提供了一個 the_content 過濾器。

給 the_content 鉤子添加一個函數,這個函數須要接收一個參數,這個參數就是當前的值。

//文章內容所有連接新窗口打開
function Bing_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() 多了一個步奏,就是每次調用函數時還要接收這個函數的返回值,最後把通過屢次過濾的值返回出去,供使用。

 

Reference from : http://www.javashuo.com/article/p-mpztiuvm-gd.html

相關文章
相關標籤/搜索