問題描述
使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。