问题描述

使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。