要想隨心所欲的給主題添加功能,wordpress的鈎子和過濾器應該要能明白。wordpress鈎子和過濾器也是插件開發的基本知識。
- 准備工作——給主題的頭部文件加上wp_head();函數
介紹與分析:要是不加這個函數,有的插件將不能正常工作!該函數位於wp-includes/general-template.php文件的1577行,原函數如下:
function wp_head() { do_action('wp_head'); }
①可以看到這個wp_head函數調用了do_action函數,傳入參數"wp_head"。該函數(do_action函數)位於wp-includes/plugin.php文件。不過這個函數就比較復雜了,這里就不講解了,只需要明白會用就好。
②do_action函數:do_action執行了一個“動作”,這個動作名稱就是這個參數"wp_head",這個“wp_head動作”是不需要定義的,do_action含有自動定義的功能。也就是不需要事先定義這個參數wp_head是什么、要干嘛,而do_action就會自動定義一個名叫wp_head的動作,並執行它。
但是,這個動作是要干什么,這里我們還需要一個函數——add_action()。注意,動作鈎子的兩個基本函數——add_action和do_action,位於同一個文件wp-includes/plugin.php中。
③add_action()函數可以給“動作”添加具體事務,比如我們已經定義並執行了一個動作“飯前”,然后我們add_action('飯前 ','洗手'),就給這個“飯前”動作添加了具體內容,在程序中來講,“洗手”這個參數應該是個函數名稱,也就是‘飯前’動作要執行這個函數。
我們do_action里面的動作——'wp_head',叫做動作鈎子(hook),鈎子可以掛東西,所以add_action就是往這個鈎子上掛函數,然后執行那個鈎子的時候,也就是執行所有掛在這個鈎子上的函數!
- 鈎子
函數: <?php do_action($tag, $arg); //$tag 必需、你想創建的動作鈎子的名稱 //$arg 傳遞給已有的動作鈎子的值 ?> <?php add_action( $tag, $function_to_add, $priority, $accepted_args ); //$tag 參數必需,動作鈎子的名稱 //$function_to_add 參數為必需,要執行的函數 //$priority 參數為int(整數),數字越小越先調用 //$accepted_args 參數為int(整數),函數需要的參數個數,默認1;自己理解:就是$function_to_add函數需要的參數個數 ?>
簡單示例一——通過wp_head()函數來往wp頭部輸出一個meta信息
<?php add_action('wp_head','echo_author'); function echo_author(){ echo '<meta name="author" content="阿樹工作室" />'; } ?>
我們只需要往wp_head動作上添加一個函數,輸出meta信息即可!
上面的函數添加在哪里呢?主題的functions.php,或者其它主題被包含的函數文件,好吧,只要主題會執行的地方。
這個應用很簡單,很多插件就是這樣工作的,像這樣來輸出css或js代碼。
簡單示例二——通過鈎子來傳遞參數
do_action('hookname',$arg_1,$arg_2,$arg_3),除了鈎子名外,還要帶3 個參數;然后add_action()中,除了鈎子名,函數名,優先級,剩下那個就是參數的個數了,也就是掛靠的這個函數需要多少個參數。
do_action傳了3個參數,那么對應的add_action()中的accepted_args——函數需要的參數個數,可以為0、1、2、3,少接受可以,但是多了就木有了。
<?php add_action('ashu','function1',10,2); add_action('ashu','function2',1,3); function function1($a1,$a2){ echo $a1.'<br />'.$a2; } function function2($a1,$a2,$a3){ echo $a1.$a2.$a3.'<br />'; } $arg_1 = '這里是阿樹工作室'; $arg_2 = '這里有主題制作教程'; $arg_3 = '我們提供主題定制服務'; do_action('ashu',$arg_1,$arg_2,$arg_3); ?>
可以看到定義並執行了一個叫“ashu”的動作鈎子,並且傳3個參數給動作函數,然后使用add_action,往這個鈎子上掛了 2個函數,function1函數需要2個參數,function2需要3個參數,所以使用add_action的時候后面對應的參數個數也是2和3。然后優先級分別是10和1,所以function2先執行。
到這里,動作的使用已經很清楚了。然而關於動作鈎子(hook)的函數不僅僅只有這兩個,還有has_action() do_action_ref_array() remove_action() remove_all_action()....要想再深入了解,可以看官網了。