WordPress 外掛開發、阻擋使用者停止特定外掛、進階 WordPress 外掛管理

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);

缺點:

  1. 使用者如果有裝 JetPack APP,還是可以在手機上停用。
  2. 使用者可以用「批次操作」來停用。

🛡️ 方法二:核彈級防護 (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');

🎉 成果展示

用了這招之後,就算使用者試圖停用外掛,也會看到這個無情的拒絕畫面:

file

就連在 APP 上操作,也會因為權限不足而失敗!(雖然 APP 介面可能不會顯示錯誤訊息,但外掛依然會保持啟用狀態)。

📝 藥藥開發心得

這功能雖然看起來簡單,但其實是藥藥踏入 WordPress 外掛開發的第一步。 研究 Hook 的觸發時機真的死了不少腦細胞 🧠。 如果不熟悉程式碼,建議還是找專業的開發者(或是問路家族的技術大神)幫忙喔!

如果有更好的做法,也歡迎留言交流!👩‍💻

累積閱覽

💬 留言交流

發表您的見解

目前還沒有留言,歡迎您留下第一則!

向下滑動載入更多留言...

目錄