問題描述
我想知道是否是根據 WordPress 主題或插件開發的一個很好的做法。
add_action('init','all_my_hooks');
function all_my_hooks(){
// some initialization stuff here and then
add_action('admin_init',-----);
add_action('admin_menu',----);
// more like so
}
謝謝
最佳解決方案
一般來説:是的,等待專用的鈎子來啓動你自己的代碼。 Never 只是將對象實例引入全局命名空間。但是 init 很少需要。
你儘可能遲到。如果您的第一個代碼運行在 wp_head 上,則不要使用較早的鈎子。你甚至可以 cascade hooks:
add_action( 'wp_head', 'first_callback' );
function first_callback()
{
// do something
// then
add_action( 'wp_footer', 'second_callback' );
}
關於 init 鈎子:改用 wp_loaded 。在 init 之後和 ms_site_check()被調用後運行。這樣您就可以避免在 multi-site 安裝中的無效子站點上運行插件。一切都是一樣的
次佳解決方案
我沒有看到這種做法的巨大好處,原因如下:
註冊時不會調用回調函數
add_action 和 add_filter 功能僅在全局變量 $wp_filter 中添加一個條目,該變量保存所有過濾器和操作。 See source 。它不會調用你的功能。只有當 do_action 和 apply_filters 被調用 (具有適當的掛鈎名稱) 時,您的代碼才會運行,這些鈎子應該在那個地方發生得很晚。
你可能會説這樣做會使全局變量 $wp_filter 變大=> 需要更多的內存。但是我認為創建一個新功能有同樣的問題。
組織代碼
將所有內容都放在一個功能中,強制您記住主題/插件中每個文件中的所有鈎子。你不會這樣做:
-
在
header.php:添加鈎子和回調函數的事情發生在標題 (如菜單,註冊腳本) -
在
content.php中:添加用於過濾內容的鈎子和回調函數 -
admin-menu.php:添加鈎子和回調函數來添加管理菜單
(假設那些文件放在你的主題/插件中)
而不是這樣,你必須:
-
在
header.php,content.php,admin-menu.php中只放置回調函數 -
並將所有鈎子分離在另一個文件中
=> 這將使您很難知道當您查看 header.php 文件的內容時會發生什麼。您必須搜索以知道這些回調何時觸發。
並在您的主題/插件中有多個課程時思考情況。你把所有班級的鈎子放在一個地方嗎?還是每個類都有一個包含所有鈎子的包裝函數?太多了!
以上這些原因,我認為這是個人風格:) 。我看到一些框架,如混合,你説的話。有時候這讓我很難在這些框架中挖掘!
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。