为特定用户分配多个或其他功能,或者如何创建其他角色,如bbpress角色?

时间:2013-10-21 作者:unfulvio

尽管我认为我理解WordPress中角色的层次结构,但我从未真正费心创建自己的用户角色或自定义功能。

我需要实现的是为某些用户分配一些功能(可能属于不同的角色:作者、订阅者、贡献者……)。我计划使用这些功能在BuddyPress驱动的社区中分配一些徽章,或者在其他环境中触发一些操作/事件(例如WooCommerce商店中的折扣)。目前,我不打算使用这些限制内容访问。

我理解WordPress不允许用户拥有多个角色(这有点令人沮丧)。但我不知道如何解决我的问题。我可能希望有一个具有新功能“x”的订阅者,还有一个具有新功能“x”的贡献者,或者还有一些具有功能“y”但不具有“x”的订阅者。对我来说,仅仅为了匹配所有的组合而创建几个新的用户角色是不切实际的。

另一种方法是类似bbPress的方法。我注意到bbPress有自己的用户角色,可以分配给可能拥有任何WordPress角色的用户。如何对我自己的角色做一些相似的事情?(并且能够从用户管理面板为用户编辑此类角色?)

或者,我应该忘记用户角色/功能而改用user\\u meta吗?

非常感谢。

1 个回复
SO网友:gmazzap

在WordPress中,创建自定义角色非常简单,还可以将特定功能分配给特定的用户角色(无论是从核心还是自定义)。

在我的插件中,我经常创建一个具有插件所需所有功能的用户角色,然后我将其中一些功能附加到现有角色上。

我给你举个例子,我认为这会帮助你面对这个问题。

假设您创建的插件需要3种功能:

您可以创建custom role 这三种功能都具备

将所有三个类别分配给管理员,将“do\\u bar”和“do\\u baz”分配给编辑、作者和撰稿人,仅将“do\\u baz”分配给订阅者,以下简单功能完成所有之前的操作:

function my_plugin_custom_caps()
{
  $caps = array(\'do_foo\' => true, \'do_bar\' => true, \'do_baz\' => true);
  // First of all create the new user role, add all custom caps + \'read\'
  add_role( \'myrole\', \'My Role\', array_merge( $caps, array( \'read\' => true ) ) );
  // Set specific caps to specific roles.
  // 1. prepare the roles array
  $all_roles = array(\'administrator\', \'editor\', \'author\', \'constributor\', \'subscriber\');
  // 2. get WP_Roles object to do the work
  $roles_obj = new WP_Roles();
  // 3. Loop roles and assign caps
  foreach ( $all_roles as $role ) {
    // 4. cycle the caps and assign them one by one using some logic to assign right caps
    foreach ( $assign as $cap ) {
       if( $role === \'subscriber\' && $cap !== \'do_baz\' ) continue;
       if( $role !== \'administrator\' && $cap === \'do_foo\' ) continue;
       $roles_obj->add_cap( $role, $cap );
    }
  }
}
WordPress在数据库上保存功能后,最好在插件激活时执行此任务,因此它只运行一次:

register_activation_hook( __FILE__, \'my_plugin_custom_caps\' );
当插件被停用时,删除添加的功能和自定义角色也是一个好习惯,因此您可以创建my_plugin_custom_caps_undo 函数并与一起使用register_deactivation_hook.

该函数几乎与my_plugin_custom_caps(), 但是remove_role 使用而不是add_roleremove_cap 而不是add_cap:

function my_custom_caps_undo() {
  remove_role( \'myrole\' );
  $caps = array(\'do_foo\' => true, \'do_bar\' => true, \'do_baz\' => true );
  $all_roles = array(\'administrator\', \'editor\', \'author\', \'constributor\', \'subscriber\');
  $roles_obj = new WP_Roles();
  foreach ( $all_roles as $role ) {
    foreach ( $caps as $cap ) {
      if( $role === \'subscriber\' && $cap !== \'do_baz\' ) continue;
      if( $role !== \'administrator\' && $cap === \'do_foo\' ) continue;
      $roles_obj->remove_cap( $role, $cap );
    }
  }
}

register_deactivation_hook( __FILE__, \'my_custom_caps_undo\' );

结束

相关推荐

WordPress编辑器,更改代码换行(bbpress?)

我正在开发一个主题,并使用jquery prettify设置代码标记的样式。到目前为止,我喜欢美化,wordpress在很大程度上是在合作。文本换行时<code> 标记一切工作正常。但在某些编辑器上,以及bbpress主题/回复/编辑编辑器上,就像在这些论坛上一样,代码被包裹在小破折号中,有时代码会被完全破坏。我想做的是强制每个编辑器安装wordpress,或者至少code 编辑器上的按钮,将代码包装在标记中,而不是小破折号。我看过一些过滤器,但至今我还没有看到如何更改wordpress标准的