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

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