上一篇我們自己實現了一個簡單的主題選項,其中涉及到WP的一個重要的函數add_action,其實只add沒有用,WP還要通過另一個函數do_action來執行add_action添加的事件。add_action相當於添加事件和事件處理程序;do_action相當於執行事件。WP是如何保證兩者的執行順序的呢?下面使用調試探索一下:
add_action:
theme-options.php下面設置斷點,訪問wp-admin/login.php,中斷后的調用堆棧:
F5步入后,發現調用了add_filter函數:
add_action登記的事件就保存在$wp_filter這個三層數組字典中,看一下變量:
do_action:
在init函數內部添加斷點,繼續執行,觀察調用堆棧:
依次調用了wp-admin下面的index.php->admin.php->menu.php->includes/menu.php->plugin.php->自定義主題的目標。依次點擊堆棧,可以查看詳細調用代碼。menu.php文件觸發了事件,調用了do_action,plugin.php文件包含do_action的定義:
大體瀏覽一下代碼我們知道了do_action根據$tag值“admin_menu”,在字典數組$wp_filter下面找到在add_action時掛到該事件的所有事件處理函數,並依次調用。
如何保證先執行add_action,后執行do_action呢?
比較兩個調用堆棧,找出重疊的部分:admin.php文件。30行調用了我們的主題cnblogs里面的add_action,而106行調用了WP內部函數do_action。