WordPress 角色和權限終極指南(譯文-出處國外)
點擊數: 2047
文章目錄
- 郭師兄:基本上,比較重要的是創造角色,配合此篇「WordPress實現角色權限等級、是否登入等隱藏部分文章內容(純代碼不外掛)」
- WordPress 在 2.0 版本中引入了角色和權限(Roles and Capabilities)系統,以前的使用者等級的方法(User Levels)已經被棄用。但是還是有很多外掛程式和主題仍然使用使用者級別的方法來控制使用者查看設置頁面和其他功能。所以這篇指南將詳細介紹 WordPress 的角色和權限系統,最終將讓你在你的外掛程式和主題中能夠正確使用。
- 什麼是角色和權限?
- 和其他 CMS 或者 Web 程式一樣,WordPress 也有一個內置的系統來驗證一個特定的用戶是否有足夠的權限來進行某種動作。WordPress 這個內置的系統就是角色和權限系統,它首先將使用者分為角色(Role),然後給每個角色都分配一定的權限。
- 下面是 WordPress 默認的用戶角色:
- 管理員 -擁有所有的管理權限
- 編輯 -發表文章,編輯文章,以及編輯其他人的文章,等等。
- 作者-發佈和編輯自己的文章
- 投稿者 -撰寫和編輯自己的文章,但不能發佈
- 訂閱者 -查看評論/添加評論/查看文章,等等。
- WordPress 的角色和權限系統比使用者等級的方法靈活得多,它支援對現有用戶角色添加,刪除和重新分配權限,甚至還可以添加更多的用戶角色,並且不破壞系統原有內置的使用者角色。
- 使用者權限和後臺功能表
- 很多外掛程式都都會在 WordPress 後臺添加一個管理頁面,讓使用者自訂外掛程式選項,一般我們可以通過下面的函數實現:
- 我們很容易發現,這些函數都會有個參數:
capability
,這個參數就是用來指定使用者看到該功能表所需要的權限。一般它的值是一個代表某種權限的字串,比如:edit_posts
。所以使用這些額函數在 WordPress 後臺中添加的功能表以及與這些功能表相關聯的頁面,是只有擁有指定的權限的用戶才可以看到和訪問的。 - 如果你的主題或者外掛程式有設置頁面,應該正確的控制哪些用戶有權限可以訪問這些頁面,比如,添加的是一個主題選項頁面,就應該使用
edit_themes
權限,而添加的是一個外掛程式選項頁面的話,使用的應該是edit_plugins
權限,當然也可以直接manage_options
權限來控制訪問外掛程式和主題選項頁面。 - 許多外掛程式仍然使用使用者等級系統(用從0到10的數位代表使用者的權限),但是 WordPress 已經廢棄了等級系統,不應該再被使用。所以使用權限系統,就不必去擔心 WordPress 不再支援使用者等級系統,並且如果想添加和使用自訂的權限,也只能使用權限系統。
- 檢查用戶的權限
- 如果使用的外掛程式或主題允許使用者更改博客的資料(添加新的內容或編輯現有的內容等),那麼我們就要檢測當前用戶是否有足夠的權限來執行這些動作,這個時候我們可以使用 current_user_can() 這個函數:
- 此函數也可以接受一個可選的參數:postID,用來檢查當前用戶是否有權限對特定文章進行某種操作:
// 檢測用戶對 ID 為 $post_ID 的日誌是否有編輯的權限 current_user_can( 'edit_post', $post_id );
- 還有另外一個函數:author_can(),可以用來檢查某個文章的作者是否具有一定的權限:
- 函數
author_can
第一個參數可以是一個 $post 物件,或一個 Post ID。 - 添加自訂用戶角色
- 有時需要為外掛程式添加新的使用者角色,比方說,我們要編寫一個新的相冊外掛程式,用戶可以註冊並上傳照片到網站,但是我們不希望這些註冊用戶可以添加或修改網站上任何其他類型的內容(如文章或頁面)。為了做到這一點,最好的辦法就是添加一個新的自訂用戶角色:
- 添加自訂使用者角色用到的函數是:add_role(),它會添加含有一組權限的一個新的用戶角色,這裡我添加一個叫做 ‘photo_uploader’ 的使用者角色,它顯示的名字是:’Photo Uploader’,它默認的權限是:’organize_gallery’:
add_role( 'photo_uploader', 'Photo Uploader', array( 'organize_gallery' ) );
- 創建好用戶角色之後,當一個用戶創建,編輯或上傳相冊的時候,我們就可以使用
current_user_can( 'organize_gallery' )
來檢查當前用戶是否有權限了。 - 並且被賦予了這個角色的用戶只可以
organize_gallery
,但不能edit_posts
或publish_posts
,所以我們無需擔心他會修改網站其他內容了。 - 要刪除一個角色,使用 remove_role() 函數,比如當使用者決定卸載外掛程式時,就應該有一個選項讓外掛程式的使用者可以刪除這些自訂角色:
remove_role( 'photo_uploader' );
- 添加自訂用戶權限
- 如果我們想為現有用戶添加權限該怎麼辦呢?繼續我們的相冊外掛程式的例子,我們想讓作者也有上傳圖片的權限,我們可以使用 add_cap() 函數:
- WordPress的權限類
- 我們已經討論過了檢查和添加權限,以及添加角色,這是管理 WordPress 使用者權限最常用的函數。然而,正如這篇文章的標題包含“終極”二字一樣,我們會介紹WordPress 用於角色和權限幕後工作的三個類,以及這些類提供的介面,我們可以在外掛程式中進行高級權限管理。這三個類是:
- wp_Roles
- wp_Role
- wp_User
- 這三個類的原始程式碼可以在
wp-includes/capabilities.php
中找到,原始程式碼注釋寫得很詳細,下面總結一下怎樣使用這些類: - wp_Roles 類
- wp_Roles 是一般的角色管理類,當我們在外掛程式中使用的時候,可以不用產生實體一個新的物件,而是直接使用 WordPress 預設創建的一個全域物件
$wp_roles
,可以在任何地方使用它,只要事先聲明global
即可: global $wp_roles;
- 我們上面使用的函數
add_role()
和remove_role()
實際上是$wp_roles->add_role()
和$wp_roles->remove_role()
的別名。因此,我們也可以直接使用$wp_roles
物件添加和刪除角色,例如: - 同樣也可以使用這種方法得到一個角色:
global $wp_roles; //通過角色名稱得到一個角色,和get_role()功能一樣 $wp_roles->get_role( $role );
- 還可以得到一個可用角色列表,含有角色的名稱和角色的顯示名稱。這個對想為使用者提供一個介面,改變權限分配時候非常有用的。
global $wp_roles; //得到一個值列表包括 $role_name => $display_name $roles = $wp_roles->get_names();
- 最後可以使用
$wp_roles
添加和刪除權限,此物件幾乎包括所有的角色和權限操作。 - wp_Role 類
- 這是一個非常簡單的類,它的功能就是添加和刪除權限。
- wp_User類
- 這個類可以管理每個用戶的角色和權限,這意味著可以為一個特定具體的用戶分配多個角色,或者為當前用戶添加特定的權限,不論他目前是什麼角色。
- 首先需要獲取使用者物件來操縱它的角色和權限:
- 我們可以通過使用者ID或用戶名得到一個使用者物件。對於第二種方法,第一個參數必須是空的(
null
或空字串),如: - 一旦得到了使用者物件,就可以為這個用戶的添加另一個角色,而無需修改他目前的角色,這意味著用戶可以有多個角色:
$user->add_role( $role_name );
- 也可以使用
remove_role()
,來為該用戶刪除某個角色: $user->remove_role( $role_name );
- 還可以為該用戶設置一個角色,這意味著該用戶將被刪除當前所有的角色,並分配一個新的角色:
$user->set_role( $role_name );
- 對於權限操作,也有很多的方法來做各種事情:
- WordPress 角色和權限之結論
郭師兄:基本上,比較重要的是創造角色,配合此篇「WordPress實現角色權限等級、是否登入等隱藏部分文章內容(純代碼不外掛)」
WordPress 在 2.0 版本中引入了角色和權限(Roles and Capabilities)系統,以前的使用者等級的方法(User Levels)已經被棄用。但是還是有很多外掛程式和主題仍然使用使用者級別的方法來控制使用者查看設置頁面和其他功能。所以這篇指南將詳細介紹 WordPress 的角色和權限系統,最終將讓你在你的外掛程式和主題中能夠正確使用。
什麼是角色和權限?
和其他 CMS 或者 Web 程式一樣,WordPress 也有一個內置的系統來驗證一個特定的用戶是否有足夠的權限來進行某種動作。WordPress 這個內置的系統就是角色和權限系統,它首先將使用者分為角色(Role),然後給每個角色都分配一定的權限。
下面是 WordPress 默認的用戶角色:
-
管理員 -擁有所有的管理權限
-
編輯 -發表文章,編輯文章,以及編輯其他人的文章,等等。
-
作者-發佈和編輯自己的文章
-
投稿者 -撰寫和編輯自己的文章,但不能發佈
-
訂閱者 -查看評論/添加評論/查看文章,等等。
WordPress 的角色和權限系統比使用者等級的方法靈活得多,它支援對現有用戶角色添加,刪除和重新分配權限,甚至還可以添加更多的用戶角色,並且不破壞系統原有內置的使用者角色。
使用者權限和後臺功能表
很多外掛程式都都會在 WordPress 後臺添加一個管理頁面,讓使用者自訂外掛程式選項,一般我們可以通過下面的函數實現:
// 添加主菜單
add_menu_page(page_title, menu_title, capability, handle, [function], [icon_url]);
// 添加子功能表
add_submenu_page(parent, page_title, menu_title, capability, file/handle, [function]);
//添加選項功能表子功能表
add_options_page(page_title, menu_title, capability, handle, [function]);
//添加工具功能表子功能表
add_management_page(page_title, menu_title, capability, handle, [function]);
//添加頁面功能表子功能表
add_pages_page( page_title, menu_title, capability, handle, [function]);
//添加文章菜單子功能表
add_posts_page( page_title, menu_title, capability, handle, [function]);
//添加主題功能表子功能表
add_theme_page( page_title, menu_title, capability, handle, [function]);
我們很容易發現,這些函數都會有個參數:capability
,這個參數就是用來指定使用者看到該功能表所需要的權限。一般它的值是一個代表某種權限的字串,比如:edit_posts
。所以使用這些額函數在 WordPress 後臺中添加的功能表以及與這些功能表相關聯的頁面,是只有擁有指定的權限的用戶才可以看到和訪問的。
如果你的主題或者外掛程式有設置頁面,應該正確的控制哪些用戶有權限可以訪問這些頁面,比如,添加的是一個主題選項頁面,就應該使用 edit_themes
權限,而添加的是一個外掛程式選項頁面的話,使用的應該是 edit_plugins
權限,當然也可以直接 manage_options
權限來控制訪問外掛程式和主題選項頁面。
許多外掛程式仍然使用使用者等級系統(用從0到10的數位代表使用者的權限),但是 WordPress 已經廢棄了等級系統,不應該再被使用。所以使用權限系統,就不必去擔心 WordPress 不再支援使用者等級系統,並且如果想添加和使用自訂的權限,也只能使用權限系統。
檢查用戶的權限
如果使用的外掛程式或主題允許使用者更改博客的資料(添加新的內容或編輯現有的內容等),那麼我們就要檢測當前用戶是否有足夠的權限來執行這些動作,這個時候我們可以使用 current_user_can() 這個函數:
if ( current_user_can( $capability ) ) {
//如果用戶擁有 $capability 的權限時執行的動作。
}
此函數也可以接受一個可選的參數:postID,用來檢查當前用戶是否有權限對特定文章進行某種操作:
// 檢測用戶對 ID 為 $post_ID 的日誌是否有編輯的權限 current_user_can( 'edit_post', $post_id );
還有另外一個函數:author_can(),可以用來檢查某個文章的作者是否具有一定的權限:
if ( author_can( $post, $capability ) ) {
// 如果文章 $post 的作者擁有 $capability 時執行的動作
}
函數 author_can
第一個參數可以是一個 $post 物件,或一個 Post ID。
添加自訂用戶角色
有時需要為外掛程式添加新的使用者角色,比方說,我們要編寫一個新的相冊外掛程式,用戶可以註冊並上傳照片到網站,但是我們不希望這些註冊用戶可以添加或修改網站上任何其他類型的內容(如文章或頁面)。為了做到這一點,最好的辦法就是添加一個新的自訂用戶角色:
添加自訂使用者角色用到的函數是:add_role(),它會添加含有一組權限的一個新的用戶角色,這裡我添加一個叫做 ‘photo_uploader’ 的使用者角色,它顯示的名字是:’Photo Uploader’,它默認的權限是:’organize_gallery’:
add_role( 'photo_uploader', 'Photo Uploader', array( 'organize_gallery' ) );
創建好用戶角色之後,當一個用戶創建,編輯或上傳相冊的時候,我們就可以使用 current_user_can( 'organize_gallery' )
來檢查當前用戶是否有權限了。
並且被賦予了這個角色的用戶只可以 organize_gallery
,但不能 edit_posts
或 publish_posts
,所以我們無需擔心他會修改網站其他內容了。
要刪除一個角色,使用 remove_role() 函數,比如當使用者決定卸載外掛程式時,就應該有一個選項讓外掛程式的使用者可以刪除這些自訂角色:
remove_role( 'photo_uploader' );
添加自訂用戶權限
如果我們想為現有用戶添加權限該怎麼辦呢?繼續我們的相冊外掛程式的例子,我們想讓作者也有上傳圖片的權限,我們可以使用 add_cap() 函數:
//獲取 "author" 的角色物件
$role = get_role( 'author' );
//為角色物件添加 "organize_gallery" 權限
$role->add_cap( 'organize_gallery' );
WordPress的權限類
我們已經討論過了檢查和添加權限,以及添加角色,這是管理 WordPress 使用者權限最常用的函數。然而,正如這篇文章的標題包含“終極”二字一樣,我們會介紹WordPress 用於角色和權限幕後工作的三個類,以及這些類提供的介面,我們可以在外掛程式中進行高級權限管理。這三個類是:
-
wp_Roles
-
wp_Role
-
wp_User
這三個類的原始程式碼可以在 wp-includes/capabilities.php
中找到,原始程式碼注釋寫得很詳細,下面總結一下怎樣使用這些類:
wp_Roles 類
wp_Roles 是一般的角色管理類,當我們在外掛程式中使用的時候,可以不用產生實體一個新的物件,而是直接使用 WordPress 預設創建的一個全域物件 $wp_roles
,可以在任何地方使用它,只要事先聲明 global
即可:
global $wp_roles;
我們上面使用的函數 add_role()
和 remove_role()
實際上是 $wp_roles->add_role()
和 $wp_roles->remove_role()
的別名。因此,我們也可以直接使用 $wp_roles
物件添加和刪除角色,例如:
global $wp_roles;
//添加新角色,和add_role()功能一樣
$wp_roles->add_role( $role, $display_name, $capabilities )
//刪除角色, 和remove_role()功能一樣
$wp_roles->;remove_role( $role );
同樣也可以使用這種方法得到一個角色:
global $wp_roles; //通過角色名稱得到一個角色,和get_role()功能一樣 $wp_roles->get_role( $role );
還可以得到一個可用角色列表,含有角色的名稱和角色的顯示名稱。這個對想為使用者提供一個介面,改變權限分配時候非常有用的。
global $wp_roles; //得到一個值列表包括 $role_name => $display_name $roles = $wp_roles->get_names();
最後可以使用 $wp_roles
添加和刪除權限,此物件幾乎包括所有的角色和權限操作。
global $wp_roles;
//為角色$role添加權限$cap
$wp_roles->add_cap( $role, $cap );
//為角色$role刪除權限$cap
$wp_roles->remove_cap( $role, $cap );
//例子
$wp_roles->add_cap( 'administrator', 'manage_galleries' );
$wp_roles->remove_cap( 'subscriber', 'view_galleries' );
wp_Role 類
這是一個非常簡單的類,它的功能就是添加和刪除權限。
//得到角色物件
$role_object = get_role( $role_name );
//為角色物件添加權限$cap
$role_object->add_cap( $capability_name );
//為角色物件刪除權限$cap
$role_object->remove_cap( $capability_name );
wp_User類
這個類可以管理每個用戶的角色和權限,這意味著可以為一個特定具體的用戶分配多個角色,或者為當前用戶添加特定的權限,不論他目前是什麼角色。
首先需要獲取使用者物件來操縱它的角色和權限:
//通過使用者ID得到使用者物件
$user = new wp_User( $id );
//或者通過用戶名
$user = new wp_User( null, $name );
我們可以通過使用者ID或用戶名得到一個使用者物件。對於第二種方法,第一個參數必須是空的(null
或空字串),如:
//通過ID得到管理員物件
$admin = new wp_User( 1 );
//通過用戶名得到管理員物件
$admin = new wp_User( null, 'admin' );
一旦得到了使用者物件,就可以為這個用戶的添加另一個角色,而無需修改他目前的角色,這意味著用戶可以有多個角色:
$user->add_role( $role_name );
也可以使用 remove_role()
,來為該用戶刪除某個角色:
$user->remove_role( $role_name );
還可以為該用戶設置一個角色,這意味著該用戶將被刪除當前所有的角色,並分配一個新的角色:
$user->set_role( $role_name );
對於權限操作,也有很多的方法來做各種事情:
//檢查該用戶是否具有某種權限或角色名稱
if ( $user->has_cap( $cap_name ) ) {
//做一些事
}
//為用戶添加權限
$user->add_cap( $cap_name );
//為用戶刪除權限
$user->remove_cap( $cap_name );
//刪除用戶所有權限
$user->remove_all_caps();