問題描述

使用 capabilities 而不是 usermeta 有什麼優勢?

例如 access_feature_xaccess_feature_x 。我可以使用 current_user_can()get_user_meta()進行各種檢查。

那麼功能提供了什麼改進呢?

Edit

對於具體答案,這個問題似乎太廣泛了。所以,我將提供一個示例上下文。請保留您的原始答案,因為它們也有幫助,並在當前答案下方添加其他信息。

例如,

  1. 我的會員網站 feature_x 的功能。

  2. 除了管理員和編輯者之外,所有用户的功能主要禁用。

  3. 一旦用户註冊了該功能,並激活了用户的新 UI 部分。

對於上面的例子。我可以和 usermeta 和能力一起去。你會如何處理給定的問題?目前我正在使用 meta

最佳解決方案

沒有一個答案,因為兩者都有利弊取決於你想要存儲什麼,為什麼。

A(可能是 non-exhaustive) 列表的選擇要考慮的差異:

  • 功能旨在檢查用户是否可以做某事。 user_cancurrent_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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。