如果你和我一樣如果寫了30多個插件,以後還會有更多的插件,肯定會和我一樣存在插件的加載順序和插件之間的依賴問題,那麼我是怎麼解決的呢?
經常看我博客和公眾號的同學都知道,我所有插件都是基於 WPJAM Basic 插件的,那麼我首先要解決的問題就是判斷 WPJAM Basic 是否已經加載,有兩種方法,
首先介紹第一種方法,我們可以通過函數is_plugin_active( $plugin )判斷某個插件是否已經激活了,所以判斷 WPJAM Basic 是否激活的代碼:
is_plugin_active('wpjam-basic/wpjam-basic.php');但是這個函數目前只是 WordPress 後台可用,如果需要在前台使用,還需要自己手動加載文件:
require_once ABSPATH . 'wp-admin/includes/plugin.php';這樣看來這個方法有點麻煩,所以我們使用到了第二種方法,通過 WordPress Action Hook 接口來處理。
首先在 WPJAM Basic 插件的最後自定義一個 action:
do_action('wpjam_loaded');然後其他函數通過函數did_action判斷該 action 執行了才加載和執行具體的代碼。
if(did_action('wpjam_loaded')){ // 加載具體的代碼}但是這樣的方式有個問題,WordPress 插件加載是基於文件名順序的,所以比如微信插件(weixin-robot-advanced)是優先 WPJAM Basic(wpjam-basic)加載的,那麼怎麼辦?
這個時候直接上面的代碼判斷,肯定是無效的,我們應該等到所有插件文件加載之後再去判斷:
add_action('plugins_loaded', function(){ if(did_action('wpjam_loaded')){ // 加載具體的代碼 }}插件之間的依賴?上面的方法完美的處理了其他插件基於 WPJAM Basic 的模式,但是如果其他插件之間也有依賴關係,我們怎麼處理,舉個例子,比如我最近寫的表單插件是基於評論增強插件。
首先評論增強插件也有一個自定義的 action:wpjam_comment_loaded。
因為表單插件和評論增強插件都是基於 WPJAM Basic,所以他們具體的代碼都是在plugins_loaded,所以他們之間具體是誰被執行並不確定的。
如果評論插件先執行:
add_action('plugins_loaded', function(){ if(did_action('wpjam_loaded') && did('wpjam_comment_loaded')){ // 加載表單插件的代碼 }}如果是表單插件先執行:
add_action('plugins_loaded', function(){ if(did_action('wpjam_loaded')){ add_action('wpjam_comment_loaded', function(){ // 加載表單插件的代碼 }); }}整合一下,就可以完美解決插件之間的依賴關係:
add_action('plugins_loaded', function(){ if(did_action('wpjam_loaded')){ // WPJAM Basic 插件已執行 function wpjam_form_load(){ // 加載表單插件的代碼 } if(did_action('wpjam_comment_loaded')){ // 評論增強插件已執行 wpjam_form_load(); }else{ // 評論增強插件執行的時候再加載 add_action('wpjam_comment_loaded', 'wpjam_form_load'); } }}如果每次都要這樣處理有點繁瑣,並且這些插件都是基於 WPJAM Basic 的,所以我在 WPJAM Basic 中增加了wpjam_load函數來處理插件依賴問題:
function wpjam_load($hook, $callback){ if(did_action($hook)){ call_user_func($callback); }else{ add_action($hook, $callback); }}然後最終的代碼簡化為:
add_action('plugins_loaded', function(){ if(did_action('wpjam_loaded')){ wpjam_load('wpjam_comment_loaded', function(){ // 加載表單插件的代碼 }); }}當然除此之外,wpjam_load還可以幫忙處理其他問題,比如某個函數需要在 init 的 action 之後執行即可:
wpjam_load('init', function(){ // 具體代碼代碼});最後說一下,wpjam_load函數需要 WPJAM Basic最新版 6.0.8 才支持。點擊卡片關注「WordPress果醬」每天分享 WordPress 使用技巧
⏬⏬ 下載 WPJAM Basic 請點擊閱讀原文