0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 使用者角色與權限完整指南:預設角色、檢查權限、建立自訂角色

如何在WordPress中創建自定義用戶角色?

網站不是只有你一個人在管理的時候,就會遇到這些問題:小編要能發文,但不能亂動外掛;客戶要能登入看資料,但不能改網站設定;某個外掛的設定頁只想讓管理員看到。

WordPress 用「角色與權限」(Roles and Capabilities)來處理這些事。這篇從觀念開始,整理預設角色的差別、怎麼在程式裡檢查權限,以及怎麼建立自訂角色。(原本另一篇〈如何在 WordPress 中創建自定義用戶角色?〉的內容已經整合到這裡。)

角色與權限是什麼?

  • 權限(Capability):一件一件具體的事,例如 edit_posts(編輯文章)、upload_files(上傳檔案)、manage_options(修改網站設定)。
  • 角色(Role):一組權限的集合。例如「作者」角色,就是「寫文章、上傳圖片、發佈自己的文章」這幾個權限打包在一起。

每個使用者被指定一個角色,就擁有那個角色的所有權限。好處是規則集中管理:想讓所有作者都多一個權限,改角色就好,不用一個一個帳號改。

很舊的教學會看到 level_0 到 level_10 這種「使用者等級」寫法,那是 WordPress 早期的機制,已經淘汰很久,新寫的程式請一律用權限名稱。

WordPress 預設的角色

單一網站預設有五種角色,由高到低:

  • 管理員(Administrator):所有權限,包含安裝外掛、切換主題、管理使用者、修改網站設定。
  • 編輯(Editor):可以發佈、編輯、刪除所有人的文章與頁面,也能管理分類、審核留言。
  • 作者(Author):可以上傳檔案,撰寫並發佈自己的文章。
  • 投稿者(Contributor):可以撰寫、編輯自己的文章,但不能發佈,也不能上傳圖片,要等編輯或管理員審核。
  • 訂閱者(Subscriber):只能登入、修改自己的個人資料。

如果是多站台(Multisite)網路,另外還有一個「超級管理員(Super Admin)」,負責管理整個網路的所有網站,這就是有些文章說 WordPress 有「六種角色」的原因。

在後台「使用者 → 所有使用者」可以修改每個帳號的角色;「設定 → 一般」裡可以設定新註冊的使用者預設是什麼角色,一般網站維持「訂閱者」就好,千萬不要設成管理員。

分配角色的建議

  • 交給小編、外包寫手的帳號,用「編輯」或「作者」就夠了,不需要給管理員。
  • 客戶或會員只需要登入看內容,用「訂閱者」或下面介紹的自訂角色。
  • 管理員帳號越少越好。每多一個管理員,就多一個被盜用時整個網站會淪陷的入口。

常用的權限名稱

寫程式、設定外掛時最常用到的幾個:

  • read:可以登入後台、看自己的個人資料。
  • edit_posts:撰寫、編輯自己的文章。
  • publish_posts:發佈文章。
  • edit_others_posts:編輯別人的文章。
  • edit_pages:編輯頁面。
  • upload_files:上傳檔案到媒體庫。
  • manage_categories:管理分類。
  • moderate_comments:審核留言。
  • edit_theme_options:管理選單、小工具等外觀設定。
  • manage_options:修改網站設定,通常用來代表「管理員」。
  • install_plugins、update_plugins、update_core:安裝外掛、更新外掛、更新 WordPress。

完整清單可以參考 WordPress 官方文件的 Roles and Capabilities。

在程式裡檢查權限

主題或外掛要判斷「目前這個人可不可以做某件事」,用 current_user_can():

PHP
if ( current_user_can( 'edit_posts' ) ) {
    // 目前登入的使用者可以編輯文章時才執行
}

也可以檢查「能不能編輯某一篇文章」,第二個參數放文章 ID:

PHP
if ( current_user_can( 'edit_post', $post_id ) ) {
    // 可以編輯 ID 為 $post_id 的這篇文章
}

edit_post(單數)這類權限會依情況判斷:作者只能編輯自己的文章,編輯可以編輯所有人的,所以一定要帶文章 ID。

其他相關的函式:

  • user_can( $user_id, 'edit_posts' ):檢查指定的使用者,而不是目前登入的人。
  • author_can( $post, 'publish_posts' ):檢查某篇文章的作者有沒有某個權限。

檢查權限,不要檢查角色名稱

很多人會寫 current_user_can( 'administrator' ) 來判斷是不是管理員。這樣寫在部分情況可以用,但官方文件不建議,結果可能不可靠。而且之後你如果新增一個「網站經理」角色,也應該能用那個功能,就得回頭改程式。

改成檢查權限,例如 current_user_can( 'manage_options' ),意思是「有權修改網站設定的人」,規則清楚,也不怕之後增加角色。

後台選單也是用權限控制

外掛、主題在後台加選單頁時,都要指定一個權限,沒有這個權限的人看不到選單,也打不開那一頁:

PHP
add_action( 'admin_menu', function () {
    add_menu_page(
        '我的設定',          // 頁面標題
        '我的設定',          // 選單名稱
        'manage_options',    // 需要的權限
        'my-settings',       // 選單代稱
        'my_settings_page'   // 顯示頁面內容的函式
    );
} );

add_submenu_page()、add_options_page()、add_management_page() 等函式也都有權限參數。要注意的是,選單權限只負責「看不看得到這一頁」,處理表單送出的程式裡,還是要再用 current_user_can() 檢查一次,並搭配 nonce 驗證(wp_nonce_field()、check_admin_referer()),才不會被人繞過。

建立自訂角色

預設的五種角色不符合需求時,可以自己建一個。例如「企業主」角色:可以登入後台、上傳檔案,但不能發佈文章:

PHP
add_role(
    'c_business',     // 角色代稱:英文小寫、底線
    '企業主',          // 後台顯示的名稱
    array(
        'read'         => true,
        'upload_files' => true,
    )
);

權限要寫成「權限名稱 => true」的格式,沒寫到的權限就是沒有。舊版教學寫成 array( 'organize_gallery' ) 只列出名稱,並不是正確的格式。

重要:角色只要建立一次

這是最多人踩到的坑。角色建立之後會存進資料庫,不是每次載入網頁時才產生的。所以:

  • 把 add_role() 直接放在 functions.php,每開一次網頁就執行一次,完全是多餘的。
  • 更麻煩的是,角色已經存在時,add_role() 什麼都不會做。你之後修改陣列裡的權限不會生效,還會以為程式壞了。

正確的做法是只在「外掛啟用」的那一刻執行一次。自己做一個小外掛就可以,不難:

  1. 用 FTP 或主機的檔案管理員,在 wp-content/plugins/ 裡建立資料夾 ahwei-custom-roles。
  2. 在資料夾裡建立 ahwei-custom-roles.php,貼上下面的程式碼。
  3. 到後台「外掛」頁面,啟用「自訂使用者角色」。
PHP
<?php
/**
 * Plugin Name: 自訂使用者角色
 * Description: 建立「企業主」角色,並讓作者可以管理相簿。
 * Version: 1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

register_activation_hook( __FILE__, 'ahwei_custom_roles_activate' );

function ahwei_custom_roles_activate() {
    // 1. 建立「企業主」角色
    //    先移除再建立,之後修改權限時,停用再啟用外掛就會更新
    remove_role( 'c_business' );
    add_role(
        'c_business',
        '企業主',
        array(
            'read'         => true,
            'upload_files' => true,
        )
    );

    // 2. 替現有的「作者」角色加上一個自訂權限
    $author = get_role( 'author' );
    if ( $author ) {
        $author->add_cap( 'ahwei_manage_gallery' );
    }
}

register_activation_hook() 只會在按下「啟用」時執行一次。remove_role() 只是把角色的定義拿掉,已經被指定成「企業主」的帳號不受影響,重新建立之後會自動套用新的權限。

之後在程式裡,就可以用 current_user_can( 'ahwei_manage_gallery' ) 判斷這個人能不能管理相簿。

移除自訂角色

確定不再需要這個角色時:

PHP
remove_role( 'c_business' );

移除之前,先把使用這個角色的帳號改成其他角色,不然那些帳號會變成「沒有角色」,登入後什麼都不能做。

替現有角色增加或拿掉權限

不一定要新建角色。常見的需求是「讓編輯也能管理選單和小工具」,替編輯角色加上 edit_theme_options 就好:

PHP
$editor = get_role( 'editor' );
if ( $editor ) {
    $editor->add_cap( 'edit_theme_options' );
}

拿掉權限用 remove_cap():

PHP
$editor = get_role( 'editor' );
if ( $editor ) {
    $editor->remove_cap( 'edit_theme_options' );
}

add_cap() 跟 add_role() 一樣會直接寫進資料庫,一樣放在上面小外掛的啟用函式裡執行一次就好。放在每次都會執行的地方,每開一頁就多寫一次資料庫。

也因為是寫進資料庫,停用外掛並不會自動還原,要拿掉權限,就要另外執行 remove_cap()。

以現有角色為基礎建立新角色

想要「跟編輯一樣,再多一點權限」的角色,可以複製編輯的權限再加上去:

PHP
$editor = get_role( 'editor' );
if ( $editor ) {
    $caps = $editor->capabilities;
    $caps['edit_theme_options'] = true;
    add_role( 'site_manager', '網站經理', $caps );
}

這段一樣放在外掛的啟用函式裡執行。

針對個別使用者調整

權限也可以只針對某一個帳號,不影響同角色的其他人。先取得使用者物件:

PHP
$user = get_user_by( 'login', 'xiaoming' ); // 用帳號名稱取得
// $user = get_userdata( 12 );              // 或用使用者 ID 取得

if ( $user ) {
    $user->set_role( 'editor' );            // 改成「編輯」,原本的角色會被移除
    $user->add_cap( 'edit_theme_options' ); // 只替這個人多加一個權限
}

WP_User 物件常用的方法:

  • set_role():設定角色,會先清掉原本所有的角色。
  • add_role()、remove_role():增加或移除一個角色。一個人可以同時有多個角色,但後台的使用者編輯畫面只會顯示其中一個,容易搞混,一般不建議這樣用。
  • add_cap()、remove_cap():替這個人加上或拿掉單一權限。
  • has_cap():檢查這個人有沒有某個權限。

想列出網站上所有的角色(例如做一個讓人選擇角色的下拉選單),可以用 wp_roles():

PHP
$roles = wp_roles()->get_names(); // 角色代稱 => 顯示名稱

舊文章裡 global $wp_roles; 的寫法也可以用,現在直接呼叫 wp_roles() 比較簡單。

不想寫程式:用外掛管理角色

只是偶爾調整的話,用外掛比較直覺:

  • User Role Editor:用勾選的方式調整每個角色的權限,也能新增角色。
  • Members:管理角色與權限,也能限制某些內容只給特定角色看。

這類外掛的修改一樣是寫進資料庫,停用外掛之後,改過的權限通常還是會留著。想還原的話,先在外掛裡把角色重設回預設值,再停用。

使用上要注意

  • 下面這些權限影響很大,幾乎等於把網站交出去,不要隨便給:manage_options、install_plugins、activate_plugins、edit_plugins、edit_themes、edit_users、promote_users。
  • 自訂權限的名稱加上自己的前綴(例如上面的 ahwei_manage_gallery),避免跟外掛的權限撞名。
  • 改權限前先備份資料庫。萬一把管理員的權限改壞了,要救回來很麻煩。

延伸閱讀

網站交給越多人一起管理,角色與權限就越需要一開始規劃好。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,需要有人幫忙照顧網站,歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!