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();
WordPress 角色和權限總結
以上就是所有有關 WordPress 角色和權限的知識,WordPress 強大的用戶角色和權限管理系統可以讓我們隨時創建復雜的項目。
最后如果你在使用上有什問題,請給我留言。