解析WordPress中函數(shù)鉤子hook的作用及基本用法
WordPress 的插件機(jī)制實(shí)際上只的就是這個(gè) Hook 了,它中文被翻譯成鉤子,允許你參與 WordPress 核心的運(yùn)行,是一個(gè)非常棒的東西,下面我們來(lái)詳細(xì)了解一下它。
鉤子分類
鉤子分為兩種,一種叫做動(dòng)作(action),還有一種叫做過(guò)濾器(filter)。這兩種鉤子實(shí)現(xiàn)原理基本一樣,后邊會(huì)講到,使用上的區(qū)別在于過(guò)濾器有返回值,而動(dòng)作沒有。
動(dòng)作的理念是讓你在一種情況或者一個(gè)特別的位置執(zhí)行一些函數(shù),比如發(fā)送一封郵件等;過(guò)濾器則是讓你修改 WordPress 核心需要用到的一個(gè)值,然后 WordPress 再用這些值做一些事情,比如函數(shù)的返回值等。
動(dòng)作鉤子
wp_head 是一個(gè)很常用的動(dòng)作鉤子,在開發(fā)主題過(guò)程中,開發(fā)者都會(huì)在 head 標(biāo)簽里加上 wp_head() 函數(shù),事實(shí)上,正是這個(gè)函數(shù)調(diào)用了 wp_head 鉤子。
如果插件開發(fā)者想要在 head 標(biāo)簽里添加一句話,就可以使用 wp_head 鉤子,下邊是個(gè)簡(jiǎn)單的例子。
//在 head 標(biāo)簽添加一些內(nèi)容 function Bing_add_head_tag(){ echo '添加內(nèi)容'; } add_action( 'wp_head', 'Bing_add_head_tag' );
添加代碼后,查看前臺(tái)的網(wǎng)頁(yè)源代碼,就能在 head 標(biāo)簽里看到我們添加的內(nèi)容了。
上邊是一個(gè)簡(jiǎn)單的例子,只是打印了一句話。利用這個(gè)鉤子,我們還可以做一個(gè)遇到 404 頁(yè)面給管理員發(fā)送一封郵件的插件,下邊簡(jiǎn)單的寫了一個(gè)。
//遇到 404 頁(yè)面給管理員發(fā)送郵件 function Bing_404_page_mail(){ if( !is_404() ) return;//如果不是 404 頁(yè)面就退出函數(shù) $to = get_option( 'admin_email' );//獲取管理員地址 $subject = '遇到 404 頁(yè)面啦!';//郵件標(biāo)題 $message = '404 頁(yè)面的地址:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];//郵件內(nèi)容 wp_mail( $to, $subject, $message );//發(fā)送郵件 } add_action( 'wp_head', 'Bing_404_page_mail' );
過(guò)濾器鉤子
根據(jù)我的親身經(jīng)歷,可能過(guò)濾器鉤子會(huì)難理解些,尤其對(duì)不熟悉 PHP 的人來(lái)說(shuō)。
過(guò)濾器鉤子可以讓你改一些東西的值,過(guò)濾器回調(diào)函數(shù)會(huì)接受一個(gè)參數(shù),這就是當(dāng)前的值。還記得那個(gè)用來(lái)調(diào)用文章內(nèi)容的 the_content() 函數(shù)吧,這個(gè)函數(shù)就提供了一個(gè) the_content 過(guò)濾器。
給 the_content 鉤子添加一個(gè)函數(shù),這個(gè)函數(shù)需要接收一個(gè)參數(shù),這個(gè)參數(shù)就是當(dāng)前的值。
//文章內(nèi)容全部鏈接新窗口打開 function Bing_autoblank( $content ){//$content 變量就是文章內(nèi)容,因?yàn)槠渌^(guò)濾器也要過(guò)濾,所以這個(gè)內(nèi)容可能是經(jīng)過(guò)其它函數(shù)過(guò)濾的 $content = str_replace( '<a', '<a target="_blank"', $content );//添加 target="_blank" return $content;//必須要把過(guò)濾后的內(nèi)容返回回去,否則值就丟了 } add_filter( 'the_content', 'Bing_autoblank' );
鉤子原理
事實(shí)上,在調(diào)用 add_action() 和 add_filter() 的時(shí)候,只是向 $wp_filter 全局變量添加了一個(gè)數(shù)組元素,還要說(shuō)的就是動(dòng)作和過(guò)濾器是公用的一個(gè)全局變量,也就是說(shuō),過(guò)濾器和動(dòng)作是不能重名的。
當(dāng)調(diào)用 do_action() 的時(shí)候,會(huì)查找 $wp_filter 全局變量中都有哪些添加到此動(dòng)作的函數(shù),循環(huán)執(zhí)行即可。
apply_filters() 比 do_action() 多了一個(gè)步奏,就是每次調(diào)用函數(shù)時(shí)還要接收這個(gè)函數(shù)的返回值,最后把經(jīng)過(guò)多次過(guò)濾的值返回出去,供使用。
獲取當(dāng)前鉤子列表
WordPress 的動(dòng)作和過(guò)濾器是插件機(jī)制的核心部分,允許你在特定的地方主動(dòng)添加自己需要執(zhí)行的動(dòng)作,一般使用 add_action() 和 add_filter() 函數(shù)掛載函數(shù)。
這些鉤子被儲(chǔ)存在 $wp_filter 全局變量里,所以,要獲取鉤子列表,可以直接獲取 $wp_filter 全局變量。
<pre><?php var_dump( $GLOBALS['wp_filter'] ); ?></pre>
上邊的代碼會(huì)打印出鉤子列表。
相關(guān)文章
php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里
這篇文章主要介紹了php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里的方法,涉及php中g(shù)ettimeofday函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03php select,radio和checkbox默認(rèn)選擇的實(shí)現(xiàn)方法
radio和checkbox默認(rèn)選擇的實(shí)現(xiàn)方法,大家參考下原理就知道了,不論asp,asp.net,jsp都是這個(gè)原理。2010-05-05php下刪除一篇文章生成的多個(gè)靜態(tài)頁(yè)面
php自定義函數(shù)之刪除一篇文章生成的多個(gè)靜態(tài)頁(yè)面,可能有多頁(yè)的文章,都是需要考慮到的。2010-08-08PHP中substr()與explode()函數(shù)用法分析
這篇文章主要介紹了PHP中substr()與explode()函數(shù)用法分析,以實(shí)例的形式較為詳細(xì)的講述了substr()與explode()函數(shù)處理字符串的技巧,是字符串操作中使用頻率比較高的函數(shù),具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11