WordPress用戶管理:角色與權限的深度解析
WordPress的用戶管理系統基於角色和權限。角色是一個包含唯一名稱和一組權限的實體,每個權限定義了該角色對平台特定功能的訪問級別。讓我們深入了解WordPress角色和權限的工作機制。
add_role()
、remove_role()
、add_cap()
和remove_cap()
等函數可用於管理角色和權限。但是,使用這些函數時必須注意數據庫訪問和性能。 register_activation_hook()
函數。另一種方法是通過設置$wp_user_roles
全局變量來繞過WordPress數據庫。 默認角色和權限列表可在WordPress Codex上找到。
數據庫將此列表存儲在wp_options
表中。
它使用序列化後的wp_user_roles
鍵。
反序列化後的數據如下所示:
<code>array( 'administrator' => array( 'name' => '管理员', 'capabilities' => array( 'switch_themes' => true, 'edit_themes' => true, 'activate_plugins' => true, 'edit_plugins' => true, 'edit_users' => true, // [...] ) ), 'contributor' => array( 'name' => '投稿者', 'capabilities' => array( 'delete_pages' => true, 'delete_others_pages' => true, 'delete_published_pages' => true, 'delete_posts' => true, // [...] ) ), // [...] );</code>
此元數據在安裝新的WordPress站點時會自動設置。
WordPress啟動時,WP_Roles
類會從數據庫加載列表。
這發生在plugins_loaded
和init
鉤子之間。
WordPress使用存儲在wp_usermeta
表中的meta_key
將用戶鏈接到其角色。
反序列化後,元數據如下所示:
<code>array( 'administrator' => true )</code>
請注意,WordPress使用數組,儘管用戶一次只能擁有一個角色,我們稍後將看到原因。
另外,請記住wp_
是當前博客的前綴。
(我們可以使用$GLOBALS['wpdb']->get_blog_prefix()
函數獲取它)。
在多站點安裝中,這允許用戶在不同的實例中使用不同的角色:
wp_capabilities
=> a:1:{s:13:"administrator";b:1;}
wp_10_capabilities
=> a:1:{s:11:"contributor";b:1;}
wp_15_capabilities
=> a:1:{s:10:"subscriber";b:1;}
[...]
此規則也適用於我們之前在wp_options
表中看到的wp_user_roles
條目。
最後,我們可以看到wp_user_level
元數據以及角色。
它用於處理舊版WordPress中的角色,現在已棄用。
我們已經了解了角色是如何加載並鏈接到用戶的;從那裡,WordPress能夠在需要時獲取給定用戶的權限。
一些默認權限在WordPress核心代碼中是硬編碼的。
例如,加載插件屏幕時,它將通過運行以下代碼來檢查當前用戶是否可以管理插件:
<code>array( 'administrator' => array( 'name' => '管理员', 'capabilities' => array( 'switch_themes' => true, 'edit_themes' => true, 'activate_plugins' => true, 'edit_plugins' => true, 'edit_users' => true, // [...] ) ), 'contributor' => array( 'name' => '投稿者', 'capabilities' => array( 'delete_pages' => true, 'delete_others_pages' => true, 'delete_published_pages' => true, 'delete_posts' => true, // [...] ) ), // [...] );</code>
角色永遠不會被硬編碼;角色只是一個權限包裝器,它只存在於數據庫中。
WordPress提供以下全局函數來幫助我們處理角色。
current_user_can()
檢查當前用戶是否擁有所需的權限。
<code>array( 'administrator' => true )</code>
WP_User::has_cap
檢查特定用戶是否擁有權限。
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
我們可以注意到current_user_can
使用了此函數。
get_editable_roles()
返回可編輯的角色。
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
此列表可能會被editable_roles
過濾器覆蓋,因此我們不應依賴此函數來獲取網站上的完整角色列表。
請注意admin_init
鉤子的使用,因為該函數尚未在init
鉤子中加載。
get_role()
根據其slug獲取WP_Role
對象。
<code>add_action('init', function() { $user = get_user_by('slug', 'admin'); if ($user->has_cap('install_plugins')) { echo '管理员可以安装插件'; } else { echo '管理员不能安装插件'; } });</code>
WP_Role::has_cap()
檢查角色是否擁有所需的權限。
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
WordPress還提供了一個完整的API來自定義角色及其權限。
add_role()
在數據庫中註冊一個新角色。
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role); }); // 这将打印: // WP_Role 对象 // ( // [name] => administrator // [capabilities] => Array // ( // [switch_themes] => 1 // [edit_themes] => 1 // [activate_plugins] => 1 // [edit_plugins] => 1 // [...]</code>
remove_role()
如果存在,則從數據庫中刪除所需的角色。
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
WP_Role::add_cap()
向角色添加權限。
<code>add_action('init', function() { add_role('plugins_manager', '插件管理员', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
這可以是核心權限(install_plugins
、edit_posts
……)或任何自定義字符串(my_awesome_plugin_cap
)。
它允許我們為我們的插件註冊任意數量的自定義權限。
WP_Role::remove_cap()
如果存在,則從角色中刪除權限。
<code>add_action('init', function() { remove_role('plugins_manager'); });</code>
WP_User::add_role()
向給定用戶添加角色。
<code>add_action('init', function() { $role = get_role('contributor'); $role->add_cap('install_plugins'); });</code>
此函數允許您理論上為同一用戶設置多個角色。
由於WordPress後端僅顯示和管理每個用戶一個角色,因此我們不應為用戶添加多個角色,並且應始終在添加新角色之前使用WP_User::remove_role()
。
WP_User::remove_role()
從給定用戶中刪除角色。
<code>add_action('init', function() { $role = get_role('contributor'); $role->remove_cap('install_plugins'); });</code>
WP_User::add_cap()
向給定用戶添加權限。
<code>array( 'administrator' => array( 'name' => '管理员', 'capabilities' => array( 'switch_themes' => true, 'edit_themes' => true, 'activate_plugins' => true, 'edit_plugins' => true, 'edit_users' => true, // [...] ) ), 'contributor' => array( 'name' => '投稿者', 'capabilities' => array( 'delete_pages' => true, 'delete_others_pages' => true, 'delete_published_pages' => true, 'delete_posts' => true, // [...] ) ), // [...] );</code>
如果我們想向用戶添加單個權限,而不必創建完整的角色,這將非常有用。
WP_User::remove_cap()
從給定用戶中刪除權限。
<code>array( 'administrator' => true )</code>
除了一個問題之外,我們看到的函數看起來都很好:數據庫訪問和性能。
我們在處理角色和權限時主要關注的是何時應該觸發我們的代碼?
為了解釋這一點,讓我們看看WordPress核心代碼。
首先,我們要添加一個新的空角色:
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
以下是add_role
函數(實際上重定向到WP_Roles::add_role
)的前幾行:
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
如果我們添加一個新角色,add_role
函數運行一次,然後什麼也不做。
接下來,假設我們要向我們新創建的角色添加權限:
<code>add_action('init', function() { $user = get_user_by('slug', 'admin'); if ($user->has_cap('install_plugins')) { echo '管理员可以安装插件'; } else { echo '管理员不能安装插件'; } });</code>
WordPress 4.2.2中的WP_Role::add_cap()
函數如下所示:
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
它更新了$this->roles
對象,但我們也可以看到數據庫將每次我們的代碼運行時都會更新,即使我們的新權限已經註冊了!
這意味著如果我們關心性能,我們為自定義角色和權限而編寫的全部代碼不應在每個頁面加載時運行。
有幾種方法可以避免這些數據庫問題。
WordPress允許插件作者使用register_activation_hook()
函數在後端啟用插件時觸發代碼。
讓我們創建一個示例插件:
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role); }); // 这将打印: // WP_Role 对象 // ( // [name] => administrator // [capabilities] => Array // ( // [switch_themes] => 1 // [edit_themes] => 1 // [activate_plugins] => 1 // [edit_plugins] => 1 // [...]</code>
此代碼僅會在網站上啟用插件時運行一次。
現在,我們必須記住,此解決方案取決於插件的激活和停用。
如果插件已經投入生產,或者在推送更新時省略了重新激活,會發生什麼情況?
事實上,此解決方案也依賴於數據庫,並且在推送代碼時需要一個額外的步驟。
還有一種未公開的解決方案,在某些情況下可以很好地工作。
讓我們最後看看WordPress核心代碼,當WP_Roles
對像在WordPress啟動時從數據庫加載角色時:
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
在從數據庫獲取數據之前,WordPress會檢查$wp_user_roles
全局變量。
如果已設置,WordPress將使用其內容,並通過將$this->use_db
變量設置為false來阻止數據庫使用。
讓我們嘗試一下,只保留一個新的、受限的管理員角色:
<code>add_action('init', function() { add_role('plugins_manager', '插件管理员', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
加載後端時,我們可以看到它保留了我們自定義角色的定義:
此解決方案解決了數據庫問題,但可能會引入其他一些問題:
但是,在構建需要自定義靜態角色列表的自定義WordPress應用程序時,這可能是一種可行的解決方案:
在本文中,我介紹了WordPress中角色和權限使用的概述。
儘管其完整的API允許我們幾乎做任何我們想做的事情,但與數據庫的關係仍然是主要問題。
在開發我們的插件和主題時,我們必須牢記這一點。
您對WordPress管理角色的方式有何看法?期待您的反饋!
WordPress有六個默認用戶角色:超級管理員、管理員、編輯、作者、投稿者和訂閱者。每個角色都有一組特定的權限。例如,超級管理員可以訪問多個站點的所有管理功能。管理員可以在單個站點上執行所有管理任務。編輯可以發布和管理帖子,包括其他用戶的帖子。作者可以發布和管理他們自己的帖子。投稿者可以撰寫和管理他們自己的帖子,但不能發布它們。訂閱者只能管理他們的個人資料。
要在WordPress中添加新的用戶角色,可以使用add_role()
函數。此函數接受三個參數:角色、顯示名稱和權限數組。例如,要添加一個名為“custom_role”的新角色,並具有讀取和編輯帖子的權限,可以使用以下代碼:
add_role( 'custom_role', __('自定义角色'), array( 'read' => true, // 可以读取帖子 'edit_posts' => true, // 可以编辑帖子 ) );
要在WordPress中刪除用戶角色,可以使用remove_role()
函數。此函數接受一個參數:角色。例如,要刪除前面添加的“custom_role”,可以使用以下代碼:
remove_role('custom_role');
要向WordPress中的用戶角色添加權限,可以使用add_cap()
函數。此函數接受兩個參數:權限和一個布爾值,指示角色是否具有該權限。例如,要向“custom_role”添加“publish_posts”權限,可以使用以下代碼:
$role = get_role('custom_role'); $role->add_cap('publish_posts', true);
要從WordPress中的用戶角色中刪除權限,可以使用remove_cap()
函數。此函數接受一個參數:權限。例如,要從“custom_role”中刪除“publish_posts”權限,可以使用以下代碼:
$role = get_role('custom_role'); $role->remove_cap('publish_posts');
要更改WordPress中的默認用戶角色,請在WordPress儀表板中導航到設置 > 常規。在“新用戶默認角色”下,從下拉菜單中選擇要設置為默認的角色。
WordPress默認不支持向用戶分配多個角色。但是,您可以使用像Multiple Roles這樣的插件來實現這一點。安裝並激活插件後,您可以從用戶的個人資料頁面向用戶分配多個角色。
要根據WordPress中的用戶角色限制內容訪問,可以使用像Members這樣的插件。此插件允許您控制哪些角色可以訪問您網站上的特定內容。
要在WordPress中創建自定義權限,可以使用add_cap()
函數。此函數接受兩個參數:權限和一個布爾值,指示角色是否具有該權限。例如,要向“custom_role”添加名為“manage_custom”的自定義權限,可以使用以下代碼:
$role = get_role('custom_role'); $role->add_cap('manage_custom', true);
要檢查WordPress中的用戶是否具有特定權限,可以使用current_user_can()
函數。此函數接受一個參數:權限。例如,要檢查當前用戶是否具有“manage_custom”權限,可以使用以下代碼:
if (current_user_can('manage_custom')) { // 当前用户具有“manage_custom”权限 }
所有圖片均保留原始格式和位置。
以上是掌握WordPress角色和功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!