問題描述
使用 capabilities 而不是 usermeta 有什麼優勢?
例如 access_feature_x 與 access_feature_x 。我可以使用 current_user_can()和 get_user_meta()進行各種檢查。
那麼功能提供了什麼改進呢?
Edit
對於具體答案,這個問題似乎太廣泛了。所以,我將提供一個示例上下文。請保留您的原始答案,因為它們也有幫助,並在當前答案下方添加其他信息。
例如,
-
我的會員網站
feature_x的功能。 -
除了管理員和編輯者之外,所有用户的功能主要禁用。
-
一旦用户註冊了該功能,並激活了用户的新 UI 部分。
對於上面的例子。我可以和 usermeta 和能力一起去。你會如何處理給定的問題?目前我正在使用 meta
最佳解決方案
沒有一個答案,因為兩者都有利弊取決於你想要存儲什麼,為什麼。
A(可能是 non-exhaustive) 列表的選擇要考慮的差異:
-
功能旨在檢查用户是否可以做某事。
user_can和current_user_can可幫助您檢查用户權限。您也可以使用用户元素來實現,但是一旦您擁有核心功能,就沒有任何意義。 -
毫無疑問,即使組與權限無關,功能也可用於對具有相似特徵的用户進行分組。在這種情況下,功能對於用户有些類似於分類術語的職位。
user_can功能可以用來檢查用户是否具有一個能力 (類似於has_term),但是沒有核心功能對於 meta 來説是一樣的。然而,通過功能檢索用户集合可能比通過簡單的元查詢檢索用户更昂貴 (這是一個猜測,而不是基於實際的性能分析數據) 。 -
要快速過濾 (沒有數據庫更改),分配給用户的所有功能都很簡單 (特別是如果使用
user_can/current_user_can檢查上限,並沒有任何理由),而對於 meta 來説也是如此。 -
Meta 可以處理嵌套數據 (例如,數組,甚至可以處理相同元鍵的不同 (集合) 值) 。這是不可能的功能。
-
能力可分為角色。角色還在後台有一個 UI,可以通過分配角色來分配功能的”set” 。元沒有這樣的好處。
-
能力是來自用户的獨立實體,並且它們能夠在用户中生存:如果您刪除所有具有能力的用户,那麼它將停留在那裏。同樣的情況不適用於 meta:如果刪除,所有元數據與用户一起發送。
Edit
在 OP 上編輯之後,我會説能力要好得多:您正在使用核心已經與功能進行的元素進行實現,而且正是這些功能是什麼。
例如,考慮到 add_menu_page 功能,它有一個 $capability 參數,可以讓您只顯示具有該功能的用户的菜單頁面。
這只是一個例子,有不同的功能接受功能作為參數。而且,正如編輯前的第一點所説,從零開始實現核心已經具備的功能是沒有意義的。
次佳解決方案
不同之處在於,該功能是站點的訪問權限系統的一部分,利用並可以通過設計用於處理權限的內置工具和 API 進行更改。您可以創建自己的權限方案,但是使用希望在功能中處理訪問權限的工具或代碼來覆蓋並不容易。
通過使用元字段而不是功能,您也將失去將用户分組到角色的能力,這可能或可能不重要。
您的問題再次突顯出 WordPress 核心的一個軟點,內容作者和網站用户之間缺乏分離。當您將用户視為網站的用户時,您應該執行功能,但如果您的代碼處理作為內容作者的用户,則可以使用元字段更好地實現。
至於編輯部分的具體例子。這很好地進入訪問控制,你甚至需要它的實際角色,因此能力是去的方式。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。