每个论坛的 bbpress 用户角色或功能

bbpress user-roles or capabilities per forum

我正在尝试设置具有扩展用户功能的 bbpress。

问题

我的目标是用户需要在每个论坛中拥有不同的能力,即:

插件

这些是我到目前为止尝试过但没有成功的插件:

第一次尝试

由于 itthinx Groups 插件允许我将多个组分配给 UserA,这很好,但它仍然没有解决我的问题。

所以,我尝试了这样的事情:

但问题是,由于 UserA 属于具有 publish_repliesmoderate 能力的组,他可以完全访问 ForumX。

所以我需要的是论坛组和用户组的交集——在这个例子中是 ForumX_readers

有前途的部分,但是...

我深入研究了插件的代码,找到了根据用户分配的组处理用户功能的行,并迅速尝试获取当前的论坛组,以实现交集。

不幸的是,我无法访问这部分代码中的 global $post$_GLOBALS['post']$_REQUEST[] 变量。既不直接也不使用 apply_filters() 函数,我自己将其实现到代码的一部分。

更新: 我能够使用 get_posts() 和当前 forum/topic.

的 slug 获得 ID

那么,我的问题

我的第一次尝试是否有任何解决方案,我可能已经监督了?

如果没有,是否有其他插件可以解决我不知道的问题?

或者在 bbpress 中这样的事情是不可能的?

经过进一步的研究和反复试验,我终于弄明白了。

第一步是设置功能,在我的例子中看起来像这样。

在插件目录中,有文件core/class-groups-user.phpinit_cache() 函数检索分配给用户的组,并设置相应的功能。

为了不让 core-plugin 乱七八糟,我对 $group_ids 变量应用了一个过滤器,可以在 行:415 中找到。

foreach( $user_groups as $user_group ) {
    $group_ids[] = Groups_Utility::id( $user_group->group_id );
}

// added this line
$group_ids = apply_filters('filter_user_group_ids', $group_ids);`

然后我创建了一个新插件,它连接到这个过滤器。

add_filter('filter_user_group_ids', 'dnmc_filter_groups', 10, 1);

function dnmc_filter_groups($user_group_ids) {
    $forum_id = dnmc_get_forum_id();
    if(!$forum_id) return $user_group_ids;

    $forum_group_ids   = Groups_Post_Access::get_read_group_ids( $forum_id);
    $user_restricted_forum_group_ids = array_intersect($user_group_ids, $forum_group_ids);

    return $user_restricted_forum_group_ids;

}

function dnmc_get_forum_id() {
    $args_topic = array(
      'name'        => basename( untrailingslashit( rtrim($_SERVER['REQUEST_URI'], '/') ) ),
      'post_type'   => 'topic',
      'post_status' => 'publish',
      'numberposts' => 1
    );

    if($topic = get_posts($args_topic)) {
        return $topic[0]->post_parent;
    }

    $args_forum = array(
      'name'        => basename( untrailingslashit( rtrim($_SERVER['REQUEST_URI'], '/') ) ),
      'post_type'   => 'forum',
      'post_status' => 'publish',
      'numberposts' => 1
    );

    if($forum = get_posts($args_forum)) {
        return $forum[0]->ID;
    }

    return false;
}