WordPress 插件2

動作鉤子 ( actions )

  • 動作鉤子讓你可以在 WordPress 加載過程中或者當某個事件發(fā)生的特定時刻觸發(fā)一個函數(shù)。例如:你可能希望當 WordPress 第一次加載一個頁面或者保存一篇文章時執(zhí)行一個函數(shù)。
do_action() 函數(shù)。

當鉤進 WordPress 中時,你的插件不會直接調(diào)用這個函數(shù);但是你的插件幾乎都會間接的使用它。

<?php
  do_action( $tag, $arg = '' );
?>
  • $tag — 動作鉤子的名稱
  • $arg — 傳遞給已注冊的動作的值。動作鉤子可以傳遞任何個數(shù)的參數(shù),或者根本不傳參數(shù)。

下面是一個具有多參數(shù)的動作鉤子的例子

<?php
  do_action( $tag, $arg_1, $arg_2, $arg_3 );
?>

例子:

<?php
  do_action('wp_head');
?>
  • wp_head 的鉤子現(xiàn)在前臺的 <head> 里面。 WordPress 和插件經(jīng)常用這個鉤子來添加 meta 信息,樣式表,和 js 腳本。

例子:

<?php
  do_action( 'save_post', $post_ID, $post );
?>
  • 這個 save_post 的鉤子傳遞兩個參數(shù),一個 $post_ID,一個 $post。

add_action() 函數(shù)

<?php
add_action( $tag, $function, $priority, $accepted_args );
?>
  • $tag – 你的函數(shù)執(zhí)行時代動作鉤子的名稱。
  • $function – WordPress 要調(diào)用的函數(shù)名。
  • $priority – 一個表示動作調(diào)用順序的整數(shù),默認是10。數(shù)字越小,這個函數(shù)越早被調(diào)用。
  • $accepted_args – 動作鉤子要傳遞給你的函數(shù)的參數(shù)個數(shù)。默認只有一個參數(shù)。

動作鉤子并不局限于單個動作。你的插件可以將多個函數(shù)添加到一個動作鉤子上。其他插件,甚至是 WordPress 核心,經(jīng)常將多個函數(shù)添加到同一個鉤子上。

  • 常見的動作鉤子是 wp_footer 。它提供給前端用戶的 WordPress 模板使用。通常它剛好在</body>前調(diào)用。在下面的例子中,將要為 wp_footer 注冊一個動作并添加一條自定義信息到 footer。
<?php
add_action( 'wp_footer', 'boj_example_footer_message', 100 );
function boj_example_footer_message() {
    echo "基于 <a  >WordPress </a>架設(shè)。;
}
?>
  • 第一個參數(shù)是鉤子的名字( wp_footer )。第二個參數(shù)是要回調(diào)的函數(shù) ( boj_example_footer_message )。第三個參數(shù)是優(yōu)先級 ( 100 )。這個函數(shù)比起其他鉤到 wp_footer 中的函數(shù),會在比較靠后的次序執(zhí)行。如果設(shè)置成1,就較先執(zhí)行。

  • 鉤子可能會因為許多原因在 WordPress 執(zhí)行過程中多次觸發(fā)。任何添加到這個鉤子中的動作每當鉤子觸發(fā)時都會執(zhí)行一次。

<?php
do_action_ref_arrray( $tag, $args );
?>
  • $tag – 動作鉤子的名字。
  • $args – 要傳遞給注冊到這個鉤子的函數(shù)的參數(shù)的數(shù)組。通常,這是一個動作可以改變的對象。
    下面看一個 WordPress 如何調(diào)用 do_action_ref_array() 的實例。下面的代碼展示了 pre_get_posts 動作鉤子。WordPress 在從數(shù)據(jù)庫取得 posts 之前執(zhí)行這個鉤子,使得插件可以改變查詢 posts 的方式。
<?php
do_action_ref_array( 'pre_get_posts', array( & $this ) );
?>
  • 第一個參數(shù) pre_get_posts 是鉤子的名字。第二個參數(shù)是從數(shù)據(jù)庫中查詢 posts 的參數(shù)的數(shù)組。這個鉤子使你可以執(zhí)行基于那個參數(shù)數(shù)組的代碼。

假如你想安裝隨機的順序來得到首頁的 blog,而不是默認的通過發(fā)布時間來得到。你就需要注冊一個動作到這個鉤子,并改變排序順序。

<?php
add_action( 'pre_get_posts', 'boj_randomly_order_blog_posts' );
function boj_randomly_order_blog_posts( $query ) {
    if( $query -> is_home && empty( $query -> query_vars['suppress_filters']))
        $query -> set( 'rderby', 'rand' );
}
?>

remove_action 函數(shù)

  • remove_action() 可以刪除先前添加到一個鉤子的動作。如果動作被成功刪除,則函數(shù)返回 true,否則返回 false。
<?php
remove_action( $tag, $function_to_remove, $priority, $accepted_args );
?>
  • 參數(shù)類似于 do_action()。要成功的從一個鉤子中刪除一個動作, $tag, $function_to_remove, 和 $priority 必須完全的復(fù)合 do_action() 中使用的參數(shù)。否則動作不會被溢出,同時 remove_action() 返回 flase。

remove_all_actions

  • 在有些插件中,可能需要刪除所有特定 tag 或者 特定 tag + 特定優(yōu)先級的所有鉤子。使用 remove_all_actions() 可以一次刪除所有符合條件的動作。
<?php
remove_all_actions( $tag, $priority );
?>
  • $priority 參數(shù)是可選的,默認是 false。如果你設(shè)置了這個參數(shù),那么只有這個優(yōu)先級的動作會被刪除。下面的例子從 wp_head 動作鉤子中刪除不管任何優(yōu)先級的動作。
<?php
remove_all_actions( 'wp_head' );
?>
  • 在使用這個函數(shù)的時候必須要小心。其他 plugin 或者 theme 可能添加了你不知道動作。這就可能破壞插件應(yīng)有的功能。通常應(yīng)該保持你的代碼盡可能的特殊。在大多數(shù)情況下,你應(yīng)該使用 remove_action() 函數(shù)來代替。

as_action

  • 有的時候需要確定一個鉤子是否包含一些動作,或者一個特定的動作是否已經(jīng)添加到了鉤子里面。has_action() 提供了這些功能。
<?php
has_action( $tag, $function_to_check );
?>
  • has_action() 函數(shù)的返回值是 Boolean 或者 一個整型值。如果 $function_to_check 參數(shù)為空,那么如果有動作已經(jīng)添加到了鉤子中就返回 true,反之,返回 false。而如果 $function_to_check 設(shè)置了,而且這個函數(shù)已經(jīng)添加到了鉤子里面,則返回該動作的優(yōu)先級,否則返回 false。

下面的例子中,根據(jù) wp_footer 動作鉤子中是否有注冊的動作來確定顯示的信息。

<?php
if( has_action( 'wp_footer' ) )
    echo '<p> footer 中已經(jīng)注冊有動作了。</p>';
else
    echo '<p> footer 中還沒有注冊動作。</p>';
?>
  • 下面看一個 WordPress 核心添加到 wp_footer 中的動作。wp_print_footer_script() 默認注冊給這個鉤子。
<?php
add_action( 'wp_footer', 'wp_print_footer_scripts' );
?>

did_action

  • did_action() 使你的插件可以檢查一個動作鉤子是否已經(jīng)被執(zhí)行,或者記錄執(zhí)行的次數(shù)。這也意味著這一次頁面的加載過程中有些動作被執(zhí)行了多次。
<?php
did_action( $tag );
?>
  • 這個參數(shù)返回動作已經(jīng)執(zhí)行的次數(shù),如果還未執(zhí)行,返回 false。這個函數(shù)的一般用途是判斷一個動作鉤子是否已經(jīng)被觸發(fā),并執(zhí)行基于 did_action() 的返回值的代碼。

下面的例子中,如果 plugins_loaded 動作鉤子已經(jīng)被觸發(fā),就定義一個 PHP 常量。

<?php
if ( did_action( 'plugins_loaded' ) )
    define( 'BOJ_MYPLUGIN_READY' ,true );
?>

register_activation_hook 和 register_deactivation_hook

常用的動作鉤子

plugins_loaded
  • 它在大多數(shù) WordPress 文件加載完成之后,并在pluggable 函數(shù)和 WordPress 開始執(zhí)行任何東西之前觸發(fā)。在大多數(shù)的插件中,在這個鉤子觸發(fā)之前,不應(yīng)該執(zhí)行其他的代碼。
    plugins_loaded 在所有用戶啟用的插件都被 WordPress 加載之后執(zhí)行。
    這也是在加載過程中插件開發(fā)這最早能用到的鉤子。

  • WordPress 的插件應(yīng)該在這個鉤子中執(zhí)行安裝。其他動作也應(yīng)該添加到這個鉤子的回調(diào)函數(shù)中。

下面的例子中,使用boj_example_footer_message 動作。
要把它添加到鉤到 plugins_loaded 鉤子中的安裝動作中,而不是單獨調(diào)用它。

<?php
 
add_action( 'plugins_loaded', 'boj_footer_message_plugin_setup' );
 
function boj_footer_message_plugin_setup() {
 
/* 添加 footer 信息動作 */
 
add_action( 'wp_footer', 'boj_example_footer_message', 100 );
 
}
 
function boj_example_footer_message() {
 
echo "基于 <a  >WordPress </a>架設(shè)。;
 
}
 
?>
  • 創(chuàng)建一個安裝函數(shù)并把它鉤到 plugins_loaded 中。這樣做就可以確保不會由于特定的 WordPress 函數(shù)還沒有加載而觸發(fā)錯誤。
init
  • init 鉤子在大多數(shù)的 WordPress 都建立之后。WordPress 同樣添加許多內(nèi)部的功能到這個鉤子中,例如 post types 和 taxonomies 的廚廁以及默認 widgets 的初始化。

  • 因為這時幾乎 WordPress 中的所有內(nèi)容都就緒了,當 WordPress 的所有信息都可用時,你的插件使用這個鉤子差不多可以做任何需要的事情了。

  • 下面的例子中,為用戶添加了給 pages 寫摘要的功能。這應(yīng)該在 init 中執(zhí)行,因為 “page” post type 在這時使用 add_post_type_support() 函數(shù)來創(chuàng)建。

<?php
 
add_action( 'init', 'boj_add_excerpts_to_pages' );
 
function boj_add_excerpts_to_pages() {
 
add_post_type_support( 'page', array( 'excerpt' ) );
 
}
 
?>

admin_menu

  • admin_menu 鉤子在管理員頁面加載的時候調(diào)用。無論何時你的插件直接在管理頁面下工作,你都要用這個鉤子來執(zhí)行你的代碼。

  • 下面的例子添加了一個內(nèi)容是 BOJ Settings 的 sub-menu 項到 WordPress 管理頁面的設(shè)置菜單。(詳見:Part-7,”插件設(shè)置”)

<?php
 
add_action( 'admin_menu', 'boj_admin_settings_page' );
 
function boj_admin_settings_page() {
 
add_options_page(
 
'BOJ Settings',
 
'BOJ Settings',
 
'manage_options',
 
'boj_admin_settings',
 
'boj_admin_settings_page'
 
);
 
}
 
?>
template_redirect
  • template_redirect 動作鉤子很有用,因為它是 WordPress 知道用戶正在瀏覽的頁面的關(guān)鍵。它在特定的頁面選擇 theme template 之前執(zhí)行。在只在網(wǎng)站的前端觸發(fā),并不在管理員頁面觸發(fā)。

  • 當你需要為特定的頁面加載代碼的時候,這個鉤子很有用。

  • 下面的例子中,僅僅為 singular post 加載一個樣式表文件。

<?php
 
add_action( 'template_redirect', 'boj_singular_post_css' );
 
function boj_singular_post_css() {
 
if( is_singular( 'post' ) ) {
 
wp_enqueue_style (       
 
'boj-singular-post',
 
'boj-example.css',
 
false,
 
0.1,
 
'screen'
 
);
 
}
 
}
 
?>
wp_head
  • 在網(wǎng)站的前端,WordPress 的模板調(diào)用 wp_head() 函數(shù),會觸發(fā) wp_head 鉤子。插件使用這個鉤子在 <head> 和 </head> 標簽之間添加 HTML。

下面的例子中在前端添加一個 meta description。

<?php
 
add_action( 'wp_head', 'boj_front_page_meta_description' );
 
function boj_front_page_meta_description() {
 
/* 得到站點描述 */
 
$description = esc_attr( get_bloginfo( 'description' ) );
 
/* 如果 description 設(shè)置了,顯示 meta 元素 */
 
if ( !empty( $description ) )
 
echo '<meta name="description" content="'. $description. '"/>';
 
}
 
?>

有些插件錯誤的使用了 wp_head 動作鉤子來添加 JavaScript 代碼,實際上應(yīng)該使用 wp_enqueue_script() 函數(shù)的。( 詳見:Part-12,”JavaScript 和 AJAX “)。唯一一種使用這個鉤子來添加 JavaScript 的情形是當 JavaScript 代碼不在一個單獨的文件中時。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內(nèi)容