
網站不是只有你一個人在管理的時候,就會遇到這些問題:小編要能發文,但不能亂動外掛;客戶要能登入看資料,但不能改網站設定;某個外掛的設定頁只想讓管理員看到。
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():
if ( current_user_can( 'edit_posts' ) ) {
// 目前登入的使用者可以編輯文章時才執行
}也可以檢查「能不能編輯某一篇文章」,第二個參數放文章 ID:
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' ),意思是「有權修改網站設定的人」,規則清楚,也不怕之後增加角色。
後台選單也是用權限控制
外掛、主題在後台加選單頁時,都要指定一個權限,沒有這個權限的人看不到選單,也打不開那一頁:
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()),才不會被人繞過。
建立自訂角色
預設的五種角色不符合需求時,可以自己建一個。例如「企業主」角色:可以登入後台、上傳檔案,但不能發佈文章:
add_role(
'c_business', // 角色代稱:英文小寫、底線
'企業主', // 後台顯示的名稱
array(
'read' => true,
'upload_files' => true,
)
);權限要寫成「權限名稱 => true」的格式,沒寫到的權限就是沒有。舊版教學寫成 array( 'organize_gallery' ) 只列出名稱,並不是正確的格式。
重要:角色只要建立一次
這是最多人踩到的坑。角色建立之後會存進資料庫,不是每次載入網頁時才產生的。所以:
- 把
add_role()直接放在functions.php,每開一次網頁就執行一次,完全是多餘的。 - 更麻煩的是,角色已經存在時,
add_role()什麼都不會做。你之後修改陣列裡的權限不會生效,還會以為程式壞了。
正確的做法是只在「外掛啟用」的那一刻執行一次。自己做一個小外掛就可以,不難:
- 用 FTP 或主機的檔案管理員,在
wp-content/plugins/裡建立資料夾ahwei-custom-roles。 - 在資料夾裡建立
ahwei-custom-roles.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' ) 判斷這個人能不能管理相簿。
移除自訂角色
確定不再需要這個角色時:
remove_role( 'c_business' );移除之前,先把使用這個角色的帳號改成其他角色,不然那些帳號會變成「沒有角色」,登入後什麼都不能做。
替現有角色增加或拿掉權限
不一定要新建角色。常見的需求是「讓編輯也能管理選單和小工具」,替編輯角色加上 edit_theme_options 就好:
$editor = get_role( 'editor' );
if ( $editor ) {
$editor->add_cap( 'edit_theme_options' );
}拿掉權限用 remove_cap():
$editor = get_role( 'editor' );
if ( $editor ) {
$editor->remove_cap( 'edit_theme_options' );
}add_cap() 跟 add_role() 一樣會直接寫進資料庫,一樣放在上面小外掛的啟用函式裡執行一次就好。放在每次都會執行的地方,每開一頁就多寫一次資料庫。
也因為是寫進資料庫,停用外掛並不會自動還原,要拿掉權限,就要另外執行 remove_cap()。
以現有角色為基礎建立新角色
想要「跟編輯一樣,再多一點權限」的角色,可以複製編輯的權限再加上去:
$editor = get_role( 'editor' );
if ( $editor ) {
$caps = $editor->capabilities;
$caps['edit_theme_options'] = true;
add_role( 'site_manager', '網站經理', $caps );
}這段一樣放在外掛的啟用函式裡執行。
針對個別使用者調整
權限也可以只針對某一個帳號,不影響同角色的其他人。先取得使用者物件:
$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():
$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),避免跟外掛的權限撞名。 - 改權限前先備份資料庫。萬一把管理員的權限改壞了,要救回來很麻煩。
延伸閱讀
- WordPress 依登入狀態、會員角色顯示部分內容:不用外掛的短代碼寫法
- WordPress 依訪客或會員角色套用不同 CSS:body class 與載入樣式檔的寫法
- WordPress 禁止非管理員進入後台:訂閱者、會員登入後自動導回首頁
網站交給越多人一起管理,角色與權限就越需要一開始規劃好。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,需要有人幫忙照顧網站,歡迎來聊聊。







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