如果你作為一名wordpress主題的開發(fā)者還不知道啥事wordpress的Hook鉤子,那可就太落伍了,其實wordpress的插件就是通過各種各樣的Hook鉤子來實現(xiàn)的,wordpress提供了非常豐富的鉤子,你可以通過Hook鉤子給主題拓展出各種各樣有趣的功能來吸引您的主題用戶。
不過,wordpress的Hook鉤子固然強大,但使用起來也是蠻復雜的,下面就來給大家介紹下吧。
- 原文來源:詳情

WordPress 分為兩種鉤子,一個稱為動作(action),一個稱為過濾器(filter)。動作的理念是讓你在一種情況或者一個特別的位置執(zhí)行一些特定函數(shù),比如發(fā)送一封郵件等;過濾器則是允許你修改 WordPress 核心需要用到的一個值,然后 WordPress 再用這些值做一些事情,比如函數(shù)的返回值等。
動作鉤子
wp_head()函數(shù)就有一個很典型的 Hook 動作,大部分主題的 head 標簽中都加入此函數(shù)。其中的鉤子為:wp_head。插件和WordPress核心都通過給 wp_head 添加鉤子函數(shù)來向網(wǎng)站的 head 標簽中加入內(nèi)容。例:
function my_wp_head() {
echo '<meta name="keywords" content="WordPress" />';
}
add_action('wp_head', 'my_wp_head');
提交代碼后,查看前臺的網(wǎng)頁源代碼,就可以在 head 標簽里看到剛剛添加的內(nèi)容了。
這邊只是是演示一個最簡單的例子。利用這個鉤子,我們還可以做一個發(fā)生訪問 404 向管理員郵箱發(fā)送一封郵件的動作。
// 發(fā)生404 向管理員郵箱發(fā)送郵件
function HN_404_page_mail(){
if( !is_404() ) return;//如果正常訪問頁面則退出該函數(shù)
$to = get_option( 'admin_email' );//獲取管理員地址
$subject = '遇到 404 頁面啦!';//郵件標題
$message = '404 頁面的地址:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];//郵件內(nèi)容
wp_mail( $to, $subject, $message );//發(fā)送郵件
}
add_action( 'wp_head', 'HN_404_page_mail' );
掛鉤函數(shù)可以選擇接受從動作調(diào)用的參數(shù),如果有任何要傳遞的話。在這個簡單的例子中,echo_comment_id
函數(shù)需要 $comment_id
參數(shù),該參數(shù)將在 comment_id_not_found
過濾鉤子運行時通過 do_action()
傳遞。
function echo_comment_id( $comment_id ) // 注意$comment_id就是動作調(diào)用的參數(shù)傳遞過來的
{
echo 'Comment ID ' . $comment_id . ' could not be found';
}
add_action( 'comment_id_not_found', 'echo_comment_id', 10, 1 );
過濾器鉤子
過濾器鉤子可以讓你改一些東西的值,過濾器回調(diào)函數(shù)會接受一個參數(shù),這就是當前的值。還記得那個用來調(diào)用文章內(nèi)容的 the_content()
函數(shù)吧,這個函數(shù)就提供了一個 the_content
過濾器。
給 the_content
鉤子添加一個函數(shù),這個函數(shù)需要接收一個參數(shù),這個參數(shù)就是當前的值。
//文章內(nèi)容圖片自動加ALT屬性為文章標題
function kratos_auto_post_link($content)//$content 變量就是文章內(nèi)容,因為其它過濾器也要過濾,所以這個內(nèi)容可能是經(jīng)過其它函數(shù)過濾的
{
global $post;
$content = preg_replace('/<\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i', "<img layer-src=\"$2\" src=\"$2\" alt=\"《".$post->post_title."》\" />", $content);
return $content;//必須要把過濾后的內(nèi)容返回回去,否則值就丟了
}
add_filter ('the_content', 'kratos_auto_post_link',0);
其他
要找出一個動作的參數(shù)的ID和名稱,只需搜索匹配 do_action()
調(diào)用的代碼庫。舉例來說,如果你掛載到’save_post
’,你會在 post.php
找到:
<?php do_action( 'save_post', $post_ID, $post ); ?>
你的 add_action
調(diào)用將是這樣:
<?php add_action( 'save_post', 'my_save_post', 10, 2 ); ?>
而且你的函數(shù)將是這樣:
function my_save_post( $post_ID, $post )
{
// do stuff here
}
鉤子原理
實際上,在調(diào)用 add_action()
和 add_filter()
的時候,只是向 $wp_filter
全局變量添加了一個數(shù)組元素,還要說的就是動作和過濾器是公用的一個全局變量,也就是說,過濾器和動作是不能重名的。
當調(diào)用 do_action()
的時候,會查找 $wp_filter
全局變量中都有哪些添加到此動作的函數(shù),循環(huán)執(zhí)行即可。
apply_filters()
比 do_action()
多了一個步奏,就是每次調(diào)用函數(shù)時還要接收這個函數(shù)的返回值,最后把經(jīng)過多次過濾的值返回出去,供使用。
獲取當前鉤子列表
WordPress 的動作和過濾器是插件機制的核心部分,允許你在特定的地方主動添加自己需要執(zhí)行的動作,一般使用 add_action()
和 add_filter()
函數(shù)掛載函數(shù)。
這些鉤子被儲存在 $wp_filter
全局變量里,所以,要獲取鉤子列表,可以直接獲取 $wp_filter
全局變量。
下面的代碼會打印出鉤子列表數(shù)組。
<?php var_dump( $GLOBALS['wp_filter'] ); ?>
以上就是這次wordpress開發(fā)的全部內(nèi)容了,光說不練假把式,來看看這個案例是咋通過wordpress的Hook鉤子來實現(xiàn)一個實用的功能的。