WordPress 外掛開發、阻擋使用者停止特定外掛、進階 WordPress 外掛管理
WordPress 的權限管理有時候真的讓人頭痛。 給使用者「管理外掛」的權限,他們就能停用所有外掛。 偏偏有些重要的功能(例如:寄信、快取、資安防護),要是被不知情的使用者誤關了,網站可是會出大事的!😱
藥藥為了這個問題,試過各種現成外掛,但都找不到完美的解決方案。 最後決定自己動手豐衣足食! 這篇就來分享如何透過程式碼,讓特定外掛只能被超級管理員 (Super Admin) 停用,其他管理員只能看不能動!
🚫 方法一:隱藏「停用」連結 (視覺欺騙法)
這招最簡單,直接把外掛列表上的「停用」按鈕藏起來。 雖然無法防止高手(或是用 APP 的人)去停用,但防君子不防小人,還是有點用的。
// 定義要保護的外掛檔名 (請參考外掛資料夾內的檔名)
const PROTECTED_PLUGINS = array(
'redis-cache/redis-cache.php',
'wp-mail-smtp/wp_mail_smtp.php'
);
// 從後台列表移除停用連結
add_filter('plugin_action_links', function ($actions, $plugin_file) {
// 如果是超級管理員,就放行
if (is_super_admin()) {
return $actions;
}
// 如果是保護名單內的外掛,就把 deactivate 選項移除
if (in_array($plugin_file, PROTECTED_PLUGINS)) {
unset($actions['deactivate']);
}
return $actions;
}, 10, 2);
缺點:
- 使用者如果有裝 JetPack APP,還是可以在手機上停用。
- 使用者可以用「批次操作」來停用。
🛡️ 方法二:核彈級防護 (Hook 攔截)
既然隱藏按鈕沒用,那我們就直接在停用動作發生時進行攔截! 不管你是用網頁點、用 APP 點、還是用念力(?),只要觸發停用,我就檢查你的權限!
完整程式碼範例
將以下程式碼加入你的佈景主題 functions.php 或是做成一個小外掛:
// 定義要保護的外掛清單
const PROTECTED_PLUGINS = array(
'redis-cache/redis-cache.php'
);
// 1. 先用方法一,把連結藏起來 (為了美觀)
add_filter('plugin_action_links', function ($actions, $plugin_file) {
if (is_super_admin()) return $actions;
if (in_array($plugin_file, PROTECTED_PLUGINS)) {
unset($actions['deactivate']);
}
return $actions;
}, 10, 2);
// 2. 定義攔截函式
function protect_plugins_from_non_admin_deactive() {
// 如果不是超級管理員,直接賜死 (誤)
if (!is_super_admin()) {
// 丟出錯誤訊息並終止程式
wp_die("✋ 母湯喔!您沒有停止此外掛的權限!請洽超級管理員。", "權限不足", 403);
}
}
// 3. 註冊停用 Hook
function init_protection_hooks() {
foreach (PROTECTED_PLUGINS as $plugin) {
// 當這些外掛被停用時,執行攔截函式
register_deactivation_hook($plugin, 'protect_plugins_from_non_admin_deactive');
}
}
add_action('init', 'init_protection_hooks');
🎉 成果展示
用了這招之後,就算使用者試圖停用外掛,也會看到這個無情的拒絕畫面:

就連在 APP 上操作,也會因為權限不足而失敗!(雖然 APP 介面可能不會顯示錯誤訊息,但外掛依然會保持啟用狀態)。
📝 藥藥開發心得
這功能雖然看起來簡單,但其實是藥藥踏入 WordPress 外掛開發的第一步。 研究 Hook 的觸發時機真的死了不少腦細胞 🧠。 如果不熟悉程式碼,建議還是找專業的開發者(或是問路家族的技術大神)幫忙喔!
如果有更好的做法,也歡迎留言交流!👩💻
累積閱覽 —
💬 留言交流
☕
目前還沒有留言,歡迎您留下第一則!
向下滑動載入更多留言...