解析WordPress中函數(shù)鉤子hook的作用及基本用法
WordPress 的插件機(jī)制實(shí)際上只的就是這個(gè) Hook 了,它中文被翻譯成鉤子,允許你參與 WordPress 核心的運(yùn)行,是一個(gè)非常棒的東西,下面我們來詳細(xì)了解一下它。
鉤子分類
鉤子分為兩種,一種叫做動(dòng)作(action),還有一種叫做過濾器(filter)。這兩種鉤子實(shí)現(xiàn)原理基本一樣,后邊會(huì)講到,使用上的區(qū)別在于過濾器有返回值,而動(dòng)作沒有。
動(dòng)作的理念是讓你在一種情況或者一個(gè)特別的位置執(zhí)行一些函數(shù),比如發(fā)送一封郵件等;過濾器則是讓你修改 WordPress 核心需要用到的一個(gè)值,然后 WordPress 再用這些值做一些事情,比如函數(shù)的返回值等。
動(dòng)作鉤子
wp_head 是一個(gè)很常用的動(dòng)作鉤子,在開發(fā)主題過程中,開發(fā)者都會(huì)在 head 標(biāo)簽里加上 wp_head() 函數(shù),事實(shí)上,正是這個(gè)函數(shù)調(diào)用了 wp_head 鉤子。
如果插件開發(fā)者想要在 head 標(biāo)簽里添加一句話,就可以使用 wp_head 鉤子,下邊是個(gè)簡單的例子。
//在 head 標(biāo)簽添加一些內(nèi)容
function Bing_add_head_tag(){
echo '添加內(nèi)容';
}
add_action( 'wp_head', 'Bing_add_head_tag' );
添加代碼后,查看前臺的網(wǎng)頁源代碼,就能在 head 標(biāo)簽里看到我們添加的內(nèi)容了。

上邊是一個(gè)簡單的例子,只是打印了一句話。利用這個(gè)鉤子,我們還可以做一個(gè)遇到 404 頁面給管理員發(fā)送一封郵件的插件,下邊簡單的寫了一個(gè)。
//遇到 404 頁面給管理員發(fā)送郵件
function Bing_404_page_mail(){
if( !is_404() ) return;//如果不是 404 頁面就退出函數(shù)
$to = get_option( 'admin_email' );//獲取管理員地址
$subject = '遇到 404 頁面啦!';//郵件標(biāo)題
$message = '404 頁面的地址:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];//郵件內(nèi)容
wp_mail( $to, $subject, $message );//發(fā)送郵件
}
add_action( 'wp_head', 'Bing_404_page_mail' );
過濾器鉤子
根據(jù)我的親身經(jīng)歷,可能過濾器鉤子會(huì)難理解些,尤其對不熟悉 PHP 的人來說。
過濾器鉤子可以讓你改一些東西的值,過濾器回調(diào)函數(shù)會(huì)接受一個(gè)參數(shù),這就是當(dāng)前的值。還記得那個(gè)用來調(diào)用文章內(nèi)容的 the_content() 函數(shù)吧,這個(gè)函數(shù)就提供了一個(gè) the_content 過濾器。
給 the_content 鉤子添加一個(gè)函數(shù),這個(gè)函數(shù)需要接收一個(gè)參數(shù),這個(gè)參數(shù)就是當(dāng)前的值。
//文章內(nèi)容全部鏈接新窗口打開
function Bing_autoblank( $content ){//$content 變量就是文章內(nèi)容,因?yàn)槠渌^濾器也要過濾,所以這個(gè)內(nèi)容可能是經(jīng)過其它函數(shù)過濾的
$content = str_replace( '<a', '<a target="_blank"', $content );//添加 target="_blank"
return $content;//必須要把過濾后的內(nèi)容返回回去,否則值就丟了
}
add_filter( 'the_content', 'Bing_autoblank' );
鉤子原理
事實(shí)上,在調(diào)用 add_action() 和 add_filter() 的時(shí)候,只是向 $wp_filter 全局變量添加了一個(gè)數(shù)組元素,還要說的就是動(dòng)作和過濾器是公用的一個(gè)全局變量,也就是說,過濾器和動(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)過多次過濾的值返回出去,供使用。
獲取當(dāng)前鉤子列表
WordPress 的動(dòng)作和過濾器是插件機(jī)制的核心部分,允許你在特定的地方主動(dòng)添加自己需要執(zhí)行的動(dòng)作,一般使用 add_action() 和 add_filter() 函數(shù)掛載函數(shù)。
這些鉤子被儲存在 $wp_filter 全局變量里,所以,要獲取鉤子列表,可以直接獲取 $wp_filter 全局變量。
<pre><?php var_dump( $GLOBALS['wp_filter'] ); ?></pre>
上邊的代碼會(huì)打印出鉤子列表。

相關(guān)文章
php實(shí)現(xiàn)登錄頁面的簡單實(shí)例
在本篇文章里小編給大家分享的是關(guān)于php實(shí)現(xiàn)登錄頁面的簡單實(shí)例以及相關(guān)知識點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-09-09
php設(shè)計(jì)模式之單例模式實(shí)例分析
這篇文章主要介紹了php設(shè)計(jì)模式之單例模式,實(shí)例分析了單例模式的原理與相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02

