WordPress用戶管理:角色與權(quán)限的深度解析
WordPress的用戶管理系統(tǒng)基于角色和權(quán)限。角色是一個(gè)包含唯一名稱和一組權(quán)限的實(shí)體,每個(gè)權(quán)限定義了該角色對平臺特定功能的訪問級別。讓我們深入了解WordPress角色和權(quán)限的工作機(jī)制。
關(guān)鍵要點(diǎn)
- WordPress的用戶管理基于角色和權(quán)限。角色擁有唯一名稱和一組權(quán)限,這些權(quán)限定義了角色對平臺不同功能的訪問級別。
- WordPress提供了一個(gè)全面的API來定制角色及其權(quán)限。
add_role()
、remove_role()
、add_cap()
和remove_cap()
等函數(shù)可用于管理角色和權(quán)限。但是,使用這些函數(shù)時(shí)必須注意數(shù)據(jù)庫訪問和性能。 - 有幾種方法可以避免在處理角色和權(quán)限時(shí)出現(xiàn)數(shù)據(jù)庫問題。一種方法是僅在啟用插件時(shí)才觸發(fā)代碼,可以使用
register_activation_hook()
函數(shù)。另一種方法是通過設(shè)置$wp_user_roles
全局變量來繞過WordPress數(shù)據(jù)庫。
幕后機(jī)制
角色存儲
默認(rèn)角色和權(quán)限列表可在WordPress Codex上找到。
數(shù)據(jù)庫將此列表存儲在wp_options
表中。
它使用序列化后的wp_user_roles
鍵。
反序列化后的數(shù)據(jù)如下所示:
<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>
此元數(shù)據(jù)在安裝新的WordPress站點(diǎn)時(shí)會(huì)自動(dòng)設(shè)置。
WordPress啟動(dòng)時(shí),WP_Roles
類會(huì)從數(shù)據(jù)庫加載列表。
這發(fā)生在plugins_loaded
和init
鉤子之間。
將用戶鏈接到角色
WordPress使用存儲在wp_usermeta
表中的meta_key
將用戶鏈接到其角色。
反序列化后,元數(shù)據(jù)如下所示:
<code>array( 'administrator' => true )</code>
請注意,WordPress使用數(shù)組,盡管用戶一次只能擁有一個(gè)角色,我們稍后將看到原因。
另外,請記住wp_
是當(dāng)前博客的前綴。
(我們可以使用$GLOBALS['wpdb']->get_blog_prefix()
函數(shù)獲取它)。
在多站點(diǎn)安裝中,這允許用戶在不同的實(shí)例中使用不同的角色:
-
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;}
[...]
此規(guī)則也適用于我們之前在wp_options
表中看到的wp_user_roles
條目。
最后,我們可以看到wp_user_level
元數(shù)據(jù)以及角色。
它用于處理舊版WordPress中的角色,現(xiàn)在已棄用。
在核心代碼中使用權(quán)限
我們已經(jīng)了解了角色是如何加載并鏈接到用戶的;從那里,WordPress能夠在需要時(shí)獲取給定用戶的權(quán)限。
一些默認(rèn)權(quán)限在WordPress核心代碼中是硬編碼的。
例如,加載插件屏幕時(shí),它將通過運(yùn)行以下代碼來檢查當(dāng)前用戶是否可以管理插件:
<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>
角色永遠(yuǎn)不會(huì)被硬編碼;角色只是一個(gè)權(quán)限包裝器,它只存在于數(shù)據(jù)庫中。
使用角色和權(quán)限:WordPress API
訪問API
WordPress提供以下全局函數(shù)來幫助我們處理角色。
current_user_can()
檢查當(dāng)前用戶是否擁有所需的權(quán)限。
<code>array( 'administrator' => true )</code>
WP_User::has_cap
檢查特定用戶是否擁有權(quán)限。
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您沒有足夠的權(quán)限來管理此站點(diǎn)的插件。')); }</code>
我們可以注意到current_user_can
使用了此函數(shù)。
get_editable_roles()
返回可編輯的角色。
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安裝插件'; } else { echo '您不能安裝插件'; } });</code>
此列表可能會(huì)被editable_roles
過濾器覆蓋,因此我們不應(yīng)依賴此函數(shù)來獲取網(wǎng)站上的完整角色列表。
請注意admin_init
鉤子的使用,因?yàn)樵摵瘮?shù)尚未在init
鉤子中加載。
get_role()
根據(jù)其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()
檢查角色是否擁有所需的權(quán)限。
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
自定義API
WordPress還提供了一個(gè)完整的API來自定義角色及其權(quán)限。
add_role()
在數(shù)據(jù)庫中注冊一個(gè)新角色。
<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()
如果存在,則從數(shù)據(jù)庫中刪除所需的角色。
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
WP_Role::add_cap()
向角色添加權(quán)限。
<code>add_action('init', function() { add_role('plugins_manager', '插件管理員', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
這可以是核心權(quán)限(install_plugins
、edit_posts
……)或任何自定義字符串(my_awesome_plugin_cap
)。
它允許我們?yōu)槲覀兊牟寮匀我鈹?shù)量的自定義權(quán)限。
WP_Role::remove_cap()
如果存在,則從角色中刪除權(quán)限。
<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>
此函數(shù)允許您理論上為同一用戶設(shè)置多個(gè)角色。
由于WordPress后端僅顯示和管理每個(gè)用戶一個(gè)角色,因此我們不應(yīng)為用戶添加多個(gè)角色,并且應(yīng)始終在添加新角色之前使用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()
向給定用戶添加權(quán)限。
<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>
如果我們想向用戶添加單個(gè)權(quán)限,而不必創(chuàng)建完整的角色,這將非常有用。
WP_User::remove_cap()
從給定用戶中刪除權(quán)限。
<code>array( 'administrator' => true )</code>
WordPress API的一些問題
除了一個(gè)問題之外,我們看到的函數(shù)看起來都很好:數(shù)據(jù)庫訪問和性能。
我們在處理角色和權(quán)限時(shí)主要關(guān)注的是何時(shí)應(yīng)該觸發(fā)我們的代碼?
為了解釋這一點(diǎn),讓我們看看WordPress核心代碼。
首先,我們要添加一個(gè)新的空角色:
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您沒有足夠的權(quán)限來管理此站點(diǎn)的插件。')); }</code>
以下是add_role
函數(shù)(實(shí)際上重定向到WP_Roles::add_role
)的前幾行:
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安裝插件'; } else { echo '您不能安裝插件'; } });</code>
如果我們添加一個(gè)新角色,add_role
函數(shù)運(yùn)行一次,然后什么也不做。
接下來,假設(shè)我們要向我們新創(chuàng)建的角色添加權(quán)限:
<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()
函數(shù)如下所示:
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
它更新了$this->roles
對象,但我們也可以看到數(shù)據(jù)庫將每次我們的代碼運(yùn)行時(shí)都會(huì)更新,即使我們的新權(quán)限已經(jīng)注冊了!
這意味著如果我們關(guān)心性能,我們?yōu)樽远x角色和權(quán)限而編寫的全部代碼不應(yīng)在每個(gè)頁面加載時(shí)運(yùn)行。
解決方法
有幾種方法可以避免這些數(shù)據(jù)庫問題。
使用插件激活
WordPress允許插件作者使用register_activation_hook()
函數(shù)在后端啟用插件時(shí)觸發(fā)代碼。
讓我們創(chuàng)建一個(gè)示例插件:
<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>
此代碼僅會(huì)在網(wǎng)站上啟用插件時(shí)運(yùn)行一次。
現(xiàn)在,我們必須記住,此解決方案取決于插件的激活和停用。
如果插件已經(jīng)投入生產(chǎn),或者在推送更新時(shí)省略了重新激活,會(huì)發(fā)生什么情況?
事實(shí)上,此解決方案也依賴于數(shù)據(jù)庫,并且在推送代碼時(shí)需要一個(gè)額外的步驟。
繞過WordPress數(shù)據(jù)庫
還有一種未公開的解決方案,在某些情況下可以很好地工作。
讓我們最后看看WordPress核心代碼,當(dāng)WP_Roles
對象在WordPress啟動(dòng)時(shí)從數(shù)據(jù)庫加載角色時(shí):
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
在從數(shù)據(jù)庫獲取數(shù)據(jù)之前,WordPress會(huì)檢查$wp_user_roles
全局變量。
如果已設(shè)置,WordPress將使用其內(nèi)容,并通過將$this->use_db
變量設(shè)置為false來阻止數(shù)據(jù)庫使用。
讓我們嘗試一下,只保留一個(gè)新的、受限的管理員角色:
<code>add_action('init', function() { add_role('plugins_manager', '插件管理員', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
加載后端時(shí),我們可以看到它保留了我們自定義角色的定義:
此解決方案解決了數(shù)據(jù)庫問題,但可能會(huì)引入其他一些問題:
- 使用原生API的插件可能無法正常工作。
- 我們必須手動(dòng)設(shè)置每個(gè)角色的定義,即使是我們不想更改的角色。
但是,在構(gòu)建需要自定義靜態(tài)角色列表的自定義WordPress應(yīng)用程序時(shí),這可能是一種可行的解決方案:
- 角色定義可以與代碼一起版本化。
- 將新代碼推送到環(huán)境將自動(dòng)更新定義。
- 不再需要考慮數(shù)據(jù)庫問題。
結(jié)論
在本文中,我介紹了WordPress中角色和權(quán)限使用的概述。
盡管其完整的API允許我們幾乎做任何我們想做的事情,但與數(shù)據(jù)庫的關(guān)系仍然是主要問題。
在開發(fā)我們的插件和主題時(shí),我們必須牢記這一點(diǎn)。
您對WordPress管理角色的方式有何看法?期待您的反饋!
掌握WordPress角色和權(quán)限的常見問題解答
WordPress中的默認(rèn)用戶角色是什么?它們的權(quán)限是什么?
WordPress有六個(gè)默認(rèn)用戶角色:超級管理員、管理員、編輯、作者、投稿者和訂閱者。每個(gè)角色都有一組特定的權(quán)限。例如,超級管理員可以訪問多個(gè)站點(diǎn)的所有管理功能。管理員可以在單個(gè)站點(diǎn)上執(zhí)行所有管理任務(wù)。編輯可以發(fā)布和管理帖子,包括其他用戶的帖子。作者可以發(fā)布和管理他們自己的帖子。投稿者可以撰寫和管理他們自己的帖子,但不能發(fā)布它們。訂閱者只能管理他們的個(gè)人資料。
如何在WordPress中添加新的用戶角色?
要在WordPress中添加新的用戶角色,可以使用add_role()
函數(shù)。此函數(shù)接受三個(gè)參數(shù):角色、顯示名稱和權(quán)限數(shù)組。例如,要添加一個(gè)名為“custom_role”的新角色,并具有讀取和編輯帖子的權(quán)限,可以使用以下代碼:
add_role( 'custom_role', __('自定義角色'), array( 'read' => true, // 可以讀取帖子 'edit_posts' => true, // 可以編輯帖子 ) );
如何在WordPress中刪除用戶角色?
要在WordPress中刪除用戶角色,可以使用remove_role()
函數(shù)。此函數(shù)接受一個(gè)參數(shù):角色。例如,要?jiǎng)h除前面添加的“custom_role”,可以使用以下代碼:
remove_role('custom_role');
如何向WordPress中的用戶角色添加權(quán)限?
要向WordPress中的用戶角色添加權(quán)限,可以使用add_cap()
函數(shù)。此函數(shù)接受兩個(gè)參數(shù):權(quán)限和一個(gè)布爾值,指示角色是否具有該權(quán)限。例如,要向“custom_role”添加“publish_posts”權(quán)限,可以使用以下代碼:
$role = get_role('custom_role'); $role->add_cap('publish_posts', true);
如何從WordPress中的用戶角色中刪除權(quán)限?
要從WordPress中的用戶角色中刪除權(quán)限,可以使用remove_cap()
函數(shù)。此函數(shù)接受一個(gè)參數(shù):權(quán)限。例如,要從“custom_role”中刪除“publish_posts”權(quán)限,可以使用以下代碼:
$role = get_role('custom_role'); $role->remove_cap('publish_posts');
如何更改WordPress中的默認(rèn)用戶角色?
要更改WordPress中的默認(rèn)用戶角色,請?jiān)赪ordPress儀表板中導(dǎo)航到設(shè)置 > 常規(guī)。在“新用戶默認(rèn)角色”下,從下拉菜單中選擇要設(shè)置為默認(rèn)的角色。
如何向WordPress中的用戶分配多個(gè)角色?
WordPress默認(rèn)不支持向用戶分配多個(gè)角色。但是,您可以使用像Multiple Roles這樣的插件來實(shí)現(xiàn)這一點(diǎn)。安裝并激活插件后,您可以從用戶的個(gè)人資料頁面向用戶分配多個(gè)角色。
如何根據(jù)WordPress中的用戶角色限制內(nèi)容訪問?
要根據(jù)WordPress中的用戶角色限制內(nèi)容訪問,可以使用像Members這樣的插件。此插件允許您控制哪些角色可以訪問您網(wǎng)站上的特定內(nèi)容。
如何在WordPress中創(chuàng)建自定義權(quán)限?
要在WordPress中創(chuàng)建自定義權(quán)限,可以使用add_cap()
函數(shù)。此函數(shù)接受兩個(gè)參數(shù):權(quán)限和一個(gè)布爾值,指示角色是否具有該權(quán)限。例如,要向“custom_role”添加名為“manage_custom”的自定義權(quán)限,可以使用以下代碼:
$role = get_role('custom_role'); $role->add_cap('manage_custom', true);
如何檢查WordPress中的用戶是否具有特定權(quán)限?
要檢查WordPress中的用戶是否具有特定權(quán)限,可以使用current_user_can()
函數(shù)。此函數(shù)接受一個(gè)參數(shù):權(quán)限。例如,要檢查當(dāng)前用戶是否具有“manage_custom”權(quán)限,可以使用以下代碼:
if (current_user_can('manage_custom')) { // 當(dāng)前用戶具有“manage_custom”權(quán)限 }
所有圖片均保留原始格式和位置。
以上是掌握WordPress角色和功能的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

使用Git管理WordPress項(xiàng)目時(shí),應(yīng)只將主題、自定義插件和配置文件納入版本控制;設(shè)置.gitignore文件以忽略上傳目錄、緩存和敏感配置;利用webhook或CI工具實(shí)現(xiàn)自動(dòng)部署并注意數(shù)據(jù)庫處理;采用兩分支策略(main/develop)進(jìn)行協(xié)作開發(fā)。這樣做可避免沖突、保障安全,并提升協(xié)作與部署效率。

使用WordPress測試環(huán)境是為了確保新功能、插件或主題在正式上線前的安全性和兼容性,避免影響真實(shí)網(wǎng)站。搭建測試環(huán)境的步驟包括:下載安裝本地服務(wù)器軟件(如LocalWP、XAMPP),創(chuàng)建站點(diǎn)、設(shè)置數(shù)據(jù)庫和管理員賬號,安裝主題和插件進(jìn)行測試;復(fù)制正式網(wǎng)站到測試環(huán)境的方法是通過插件導(dǎo)出站點(diǎn)、導(dǎo)入測試環(huán)境并替換域名;使用時(shí)應(yīng)注意不使用真實(shí)用戶數(shù)據(jù)、定期清理無用數(shù)據(jù)、備份測試狀態(tài)、適時(shí)重置環(huán)境,并統(tǒng)一團(tuán)隊(duì)配置以減少差異問題。

創(chuàng)建Gutenberg塊的關(guān)鍵在于理解其基本結(jié)構(gòu)并正確連接前后端資源。1.準(zhǔn)備開發(fā)環(huán)境:安裝本地WordPress、Node.js和@wordpress/scripts;2.使用PHP注冊塊并用JavaScript定義塊的編輯和顯示邏輯;3.通過npm構(gòu)建JS文件以使更改生效;4.遇到問題時(shí)檢查路徑、圖標(biāo)是否正確或使用實(shí)時(shí)監(jiān)聽構(gòu)建避免重復(fù)手動(dòng)編譯。按照這些步驟,可以逐步實(shí)現(xiàn)一個(gè)簡單的Gutenberg塊。

在WordPress中,當(dāng)新增自定義文章類型或修改固定鏈接結(jié)構(gòu)后,需手動(dòng)刷新重寫規(guī)則,此時(shí)可通過代碼調(diào)用flush_rewrite_rules()函數(shù)實(shí)現(xiàn)。1.可在主題或插件激活鉤子中添加該函數(shù)以自動(dòng)刷新;2.僅在必要時(shí)執(zhí)行一次,如添加CPT、分類法或修改鏈接結(jié)構(gòu)后;3.避免頻繁調(diào)用以免影響性能;4.多站點(diǎn)環(huán)境下需視情況為每個(gè)站點(diǎn)單獨(dú)刷新;5.某些托管環(huán)境可能限制規(guī)則保存。此外,訪問“設(shè)置>固定鏈接”頁面點(diǎn)擊保存也可觸發(fā)刷新,適合非自動(dòng)化場景。

tosetupredirectsinwordpressingthe.htaccessfile,locateThEfileInyourSite'sRootDirectorectoryAndDrectRectrulesabovethe#beginWordPresssection.forbasic301redirects,USETHEETHEETERECTREFTATRECTATREDERTREFTATREDERTREFTATRECTRECTATRECTRECTATREDECT301/OLD-PAGEHTTPS:

要實(shí)現(xiàn)響應(yīng)式WordPress主題設(shè)計(jì),首先要使用HTML5和移動(dòng)優(yōu)先的Meta標(biāo)簽,在header.php中添加viewport設(shè)置以確保移動(dòng)端正確顯示,并用HTML5結(jié)構(gòu)標(biāo)簽組織布局;其次,利用CSS媒體查詢實(shí)現(xiàn)不同屏幕寬度下的樣式適配,按移動(dòng)優(yōu)先原則編寫樣式,常用斷點(diǎn)包括480px、768px和1024px;第三,彈性處理圖片和布局,為圖片設(shè)置max-width:100%并使用Flexbox或Grid布局替代固定寬度;最后,通過瀏覽器開發(fā)者工具和真實(shí)設(shè)備進(jìn)行充分測試,優(yōu)化加載性能,確保響應(yīng)

UsingsMtpForWordPresseMailSimProvesDeliverabilitialComparedComparedTothEdeDefaultPhpMail()函數(shù).1.smtpauthenticateswithyouremailserver.2.somemomehostsdisablesablephpmail()

TOINTEGRATETHIRD-PARTYAPISINTOWORDPRESS,關(guān)注臺詞:1.SelectAutableabepianDobtainCredentialslikeapikeYsoroAuthtoKensByEnterRegisteringThemSecure.2.ChooseBeteBetB??eteBetB??eteBetB??etebetInpliCityOorcustimplicityOrcustomPliCoseTompliCoseTomploomcoseusionfunctionfunctionfunctibunitiacuciencipuity forfunigation。
