每个论坛的 bbpress 用户角色或功能
bbpress user-roles or capabilities per forum
我正在尝试设置具有扩展用户功能的 bbpress。
问题
我的目标是用户需要在每个论坛中拥有不同的能力,即:
- UserA 无法访问 ForumW
- 用户 A 可以只能阅读 ForumX 中的主题和回复
- 用户 A 可以在 ForumY创建主题和写回复
- UserA 可以审核 ForumZ
插件
这些是我到目前为止尝试过但没有成功的插件:
终极会员,正式1.7和新2.0版本
https://ultimatemember.com/
他们声称他们正在为 UltimateMember v2 开发一个群组扩展,看起来很有前途,但到目前为止还没有发布日期,我仍然不知道这个扩展是否能解决我的问题。
itthinx 群组插件
http://docs.itthinx.com/document/groups/
允许我将多个组分配给用户和论坛,但仍有问题。
第一次尝试
由于 itthinx Groups 插件允许我将多个组分配给 UserA,这很好,但它仍然没有解决我的问题。
所以,我尝试了这样的事情:
ForumX 分配了以下组:ForumX_readers
、ForumX_writers
、ForumX_moderators
用户 A 分配了以下组:ForumX_readers
、ForumY_writers
、ForumZ_moderators
但问题是,由于 UserA 属于具有 publish_replies
和 moderate
能力的组,他可以完全访问 ForumX。
所以我需要的是论坛组和用户组的交集——在这个例子中是 ForumX_readers
。
有前途的部分,但是...
我深入研究了插件的代码,找到了根据用户分配的组处理用户功能的行,并迅速尝试获取当前的论坛组,以实现交集。
不幸的是,我无法访问这部分代码中的 global $post
、$_GLOBALS['post']
或 $_REQUEST[]
变量。既不直接也不使用 apply_filters()
函数,我自己将其实现到代码的一部分。
更新:
我能够使用 get_posts()
和当前 forum/topic.
的 slug 获得 ID
那么,我的问题
我的第一次尝试是否有任何解决方案,我可能已经监督了?
如果没有,是否有其他插件可以解决我不知道的问题?
或者在 bbpress 中这样的事情是不可能的?
经过进一步的研究和反复试验,我终于弄明白了。
第一步是设置功能,在我的例子中看起来像这样。
在插件目录中,有文件core/class-groups-user.php
。 init_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;
}
我正在尝试设置具有扩展用户功能的 bbpress。
问题
我的目标是用户需要在每个论坛中拥有不同的能力,即:
- UserA 无法访问 ForumW
- 用户 A 可以只能阅读 ForumX 中的主题和回复
- 用户 A 可以在 ForumY创建主题和写回复
- UserA 可以审核 ForumZ
插件
这些是我到目前为止尝试过但没有成功的插件:
终极会员,正式1.7和新2.0版本
https://ultimatemember.com/
他们声称他们正在为 UltimateMember v2 开发一个群组扩展,看起来很有前途,但到目前为止还没有发布日期,我仍然不知道这个扩展是否能解决我的问题。itthinx 群组插件
http://docs.itthinx.com/document/groups/
允许我将多个组分配给用户和论坛,但仍有问题。
第一次尝试
由于 itthinx Groups 插件允许我将多个组分配给 UserA,这很好,但它仍然没有解决我的问题。
所以,我尝试了这样的事情:
ForumX 分配了以下组:
ForumX_readers
、ForumX_writers
、ForumX_moderators
用户 A 分配了以下组:
ForumX_readers
、ForumY_writers
、ForumZ_moderators
但问题是,由于 UserA 属于具有 publish_replies
和 moderate
能力的组,他可以完全访问 ForumX。
所以我需要的是论坛组和用户组的交集——在这个例子中是 ForumX_readers
。
有前途的部分,但是...
我深入研究了插件的代码,找到了根据用户分配的组处理用户功能的行,并迅速尝试获取当前的论坛组,以实现交集。
不幸的是,我无法访问这部分代码中的 global $post
、$_GLOBALS['post']
或 $_REQUEST[]
变量。既不直接也不使用 apply_filters()
函数,我自己将其实现到代码的一部分。
更新:
我能够使用 get_posts()
和当前 forum/topic.
那么,我的问题
我的第一次尝试是否有任何解决方案,我可能已经监督了?
如果没有,是否有其他插件可以解决我不知道的问题?
或者在 bbpress 中这样的事情是不可能的?
经过进一步的研究和反复试验,我终于弄明白了。
第一步是设置功能,在我的例子中看起来像这样。
在插件目录中,有文件core/class-groups-user.php
。 init_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;
}