[WordPress] 後台整理術:隱藏不必要的選單控制項目

本篇文章更新時間:2023/07/29
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


續前篇 [WordPress] 後台整理術:管理頁面修改權限,這系列自然是不能少了「後台選單」的控制。

更多關於「後台整理」可以點連結查看。

在我預設開站作業的時後,這塊需求主要是使用 Adminimize 這款處理,功能實在強大與方便!搭配使用 User Role Editor 先建立好的使用者權限後,就可以開始針對角色權限去設定哪些選單對哪些權限開放這件事。

光是這兩套的組合其實就可以玩得很複雜了!本文算是筆記一個這個整理的流程以及程式化來處理這類需求的方法。

切入方式:

  1. WordPress 提供的方法: remove_menu_page, remove_submenu_page 以及
  2. 全域變數 global $submenu, $menu, $pagenow;

我常用的程式碼片段如下:

function mxp_admin_menu_modify_for_user() {
    global $submenu, $menu, $pagenow;
    $user          = wp_get_current_user();
    $allowed_roles = array('administrator');
    //不是管理員,都把下面的設定選項移除
    if (!array_intersect($allowed_roles, $user->roles)) {
        if (isset($submenu['themes.php'])) {
            foreach ($submenu['themes.php'] as $index => $menu_item) {
                foreach ($menu_item as $value) {
                    if (strpos($value, 'customize') !== false) {
                        unset($submenu['themes.php'][$index]);
                    }
                    // if (strpos($value, 'edit_theme_options') !== false) {
                    //     unset($submenu['themes.php'][$index]);
                    // }
                }
            }
        }
        if (isset($submenu['options-general.php'])) {
            foreach ($submenu['options-general.php'] as $index => $menu_item) {
                foreach ($menu_item as $value) {
                    if (strpos($value, 'menu_editor') !== false) {
                        unset($submenu['options-general.php'][$index]);
                    }
                    if (strpos($value, 'adminimize-options') !== false) {
                        unset($submenu['options-general.php'][$index]);
                    }
                    if (strpos($value, 'settings-user-role-editor.php') !== false) {
                        unset($submenu['options-general.php'][$index]);
                    }
                }
            }
        }
        if (isset($submenu['users.php'])) {
            foreach ($submenu['users.php'] as $index => $menu_item) {
                foreach ($menu_item as $value) {
                    if (strpos($value, 'users-user-role-editor.php') !== false) {
                        unset($submenu['users.php'][$index]);
                    }
                }
            }
        }
    }
}
add_action('admin_init', 'mxp_admin_menu_modify_for_user', 100);

我這邊使用修改 $submenu 全域變數內容來達成修改,控制角色能夠觀看到的選單。但這邊要注意,這只是拿掉選單,不代表有權限的人不能進頁面操作。

上述提供的程式不是照貼就好,還請根據自己需求來調整。

選單的管理其實就架構上來看的確還是很雜亂,或許之後的某個版本也會來對這塊修正也不一定,但目前要做這方面程式化調整的的話,也少不了偵錯觀看變數組成的方式。

if (!function_exists('debug_admin_menus')):
function debug_admin_menus() {
if ( !is_admin())
        return;
    global $submenu, $menu, $pagenow;
    if ( current_user_can('manage_options') ) { // ONLY DO THIS FOR ADMIN
        if( $pagenow == 'index.php' ) {  // PRINTS ON DASHBOARD
            echo '
'; print_r( $menu ); echo '
'; // TOP LEVEL MENUS echo '
'; print_r( $submenu ); echo '
'; // SUBMENUS } } } add_action( 'admin_notices', 'debug_admin_menus' ); endif;

Ref: How to remove admin menu pages inserted by plugins?

這段可以讓有管理權限的人在「控制台」首頁上方看到使用通知提示的選單變數架構。或是自己搭配 Query Monitor 這外掛來把變數印出來看也可以。

給客戶的後台越乾淨,自然客戶走錯路亂改到不該動到東西的機率就越低。再來當然是把使用者權限分級,也不會造成這麼容易走錯路的問題!

算是網站處理好後,準備上線前一定會經過的流程。(需要等最後都確定好功能才來做收斂)


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon