WordPress 之因此能成爲世界上最受歡迎的網頁內容管理系統,緣由就在於它的高度靈活性和可塑性,而這種靈活性和可塑性正是由「掛鉤」(Hooks)簡潔宜用的結構所決定的。能夠說,沒有過濾掛鉤(Filter Hooks)和動做掛鉤(Action Hooks), WordPress 就不會具備這樣高的可拓展性,咱們也不可能會有如此多的 WordPress 插件和主題可供選擇。php
在本系列教程中,我將會向你詳細介紹 WordPress 中的動做掛鉤。在整個教程中,咱們將會涵蓋有關動做掛鉤幾乎全部方面的內容。web
這個學習過程將會很是漫長,因此,請作好準備。數組
在 Codex ( WordPress 法典)中,給出的定義以下:sass
動做掛鉤由 WordPress 中的特定事件激活,例如:發佈一篇文章、更改主題,或者是顯示管理控制界面( administration screen)。動做掛鉤是在插件(或主題)中定義的自定義PHP函數,即被設定爲迴應某些特定事件。less
因此,從本質上來講,動做掛鉤由某個 WordPress 事件激活,能夠在事件以前或以後運行。動做掛鉤只是WordPress的兩種掛鉤之一,另外一個則是咱們以前講到的過濾掛鉤(Filters)——若是想了解更多有關 WordPress 過濾掛鉤的內容,請參閱《50個 WordPress 過濾掛鉤》一文。wordpress
定義動做掛鉤只是最簡單的一步,幸運的是,學會如何建立和使用動做掛鉤也是很是簡單的。首先,讓咱們來看看怎樣將相關函數掛載到動做掛鉤上,怎樣建立新的動做掛鉤,清除現有的掛鉤和其餘在 WordPress core中與動做掛鉤相關的函數。函數
其中最簡單的函數也許就是 add_action():它能夠將某個函數掛載到咱們即將使用的動做掛鉤上post
<?php
add_action( $hook_name, $function_name, $priority, $arguments );
?>
讓咱們來看看這些參數意味着什麼:學習
讓咱們來看一個簡單的例子:spa
<?php
add_action( 'add_meta_boxes', 'my_function', 10, 2 );
function my_function( $post_type, $post ) {
// do stuff with $post_type and $post
}
?>
很簡單,對吧?
咱們可使用如下兩個函數清除動做掛鉤中的原有函數: remove_action() 和 remove_all_actions()
首先來看一看它們是如何使用的:
<?php
// remove_action( $hook_name, $function_name, $priority );
remove_action( 'login_enqueue_scripts', 'some_function', 10 );
// remove_all_actions( $hook_name, $priority );
remove_all_actions( 'wp_enqueue_scripts', 10 );
?>
remove_action() 有三個參數:掛鉤名稱、要清除的函數名和使用 add_action() 時設置的優先級別。 remove_all_actions() 函數則沒有$function_name 參數,由於它會清除動做掛鉤中的全部函數。
若是你想要開發 WordPress插件或者主題的話,一個值得推薦的作法是在你的代碼中建立一些掛鉤,這樣其餘的開發人員就能夠繼續擴展你的插件和主題了。而要作到這一點,咱們須要兩個函數:do_action() 和 do_action_ref_array()。讓咱們來看看第一個函數是如何運做的:
<?php
do_action( $hook_name, $arg1, $arg2, /* ... */ $argN );
/*
* Usage:
*
* add_action( hook_name, my_function )
*
* function my_function( $arg1, $arg2 ) {
* // do stuff with $arg1, $arg2 and so on
* }
*
*/
?>
正如你所看到的那樣,這個函數實際上能夠包含無限多的參數,你能夠根據須要來定義任意多的參數。若是你想在一個數組中保存這些參數,那麼你還須要使用第二個函數:
<?php
$args = array( $arg1, $arg2, /* ... */ $argN );
do_action_ref_array( $hook_name, $args );
/*
* Usage:
*
* add_action( hook_name, my_function )
*
* function my_function( $args ) {
* // do stuff with $args[0], $args[1] and so on
* }
*
*/
?>
若是你想知道一個動做掛鉤被調用的次數,你可使用一個簡單方便的函數來統計:
<?php
function tuts_foo() {
$action_count = did_action( 'some_action_name' );
if ( 1 === $action_count ) {
// run code if 'some_action_name' has been fired only once
}
}
?>
正如你看到的那樣,這個函數中惟一的參數就是動做掛鉤的命名。
假設你正在爲一個流行的 WordPress 插件開發其餘的擴展插件,你首先須要檢查用戶是否已經安裝了這個 WordPress 插件。(畢竟,若是這個插件沒有安裝並激活的話,那麼你後來開發的插件也將沒法使用。)
爲了進行這項檢查,你可使用 has_action() 函數以肯定這個插件的動做掛鉤是能夠訪問的:
<?php
if( has_action( 'some_popular_plugin_action' ) {
add_action( 'some_popular_plugin_action', 'extension_to_the_some_popular_plugin' );
} else {
wp_die( 'Sorry to kill your website but I need "Some Popular Plugin" to work with.' );
// CAUTION: This is a joke. Don't shut down a website because your plugin can't work with it.
}
?>
就像 did_action() 函數,has_action() 函數只有一個參數:動做掛鉤的名稱。