[buddypress-trac] [BuddyPress Trac] #6677: Groups: Draft, Locked or Suspended status
buddypress-trac
noreply at wordpress.org
Wed Jul 6 16:31:02 UTC 2016
#6677: Groups: Draft, Locked or Suspended status
------------------------------------+-----------------------------
Reporter: dcavins | Owner:
Type: enhancement | Status: new
Priority: normal | Milestone: Future Release
Component: Groups | Version: 2.6.1.1
Severity: normal | Resolution:
Keywords: has-patch dev-feedback |
------------------------------------+-----------------------------
Changes (by dcavins):
* keywords: => has-patch dev-feedback
* version: 2.3.3 => 2.6.1.1
Comment:
Here's my first draft of an approach to adding more flexible group
statuses and adding finer-grained control over group capabilities. This
approach allows developers to filter the common group statuses, add
completely new statuses, and check group capabilities. This is sort of a
simplification of WP's user role capability system applied to groups.
== Ways to filter group statuses: ==
=== Filter one of the default statuses (applies to all groups with that
status): ===
{{{
add_filter( 'bp_groups_public_group_status_caps',
'my_edit_public_group_status_filter' );
function my_edit_public_group_status_filter( $caps ) {
// Members must request to join public groups and be approved.
$caps['join_method'] = 'accepts_membership_requests';
return $caps;
}
}}}
=== Add a completely new status (or remove an existing status): ===
{{{
add_action( 'bp_groups_register_group_statuses',
'my_register_group_status' );
function my_register_group_status() {
// A generally public group with moderated membership.
bp_groups_register_group_status( 'sprivate', array(
'display_name' => 'Semi Private',
'capabilities' => array( 'join_method' =>
'accepts_membership_requests' ),
'fallback_status' => 'public',
'priority' => 20,
) );
// Make a group visible only to site admins.
bp_groups_register_group_status( 'suspended', array(
'display_name' => 'Suspended',
'capabilities' => array( 'show_group' => 'noone',
'access_group' => 'noone', ),
'fallback_status' => 'hidden',
'priority' => 95,
) );
// Remove the stock "hidden" status (this would be a bad idea in the
short term).
bp_groups_deregister_group_status( 'hidden' );
}
}}}
=== Filter the capabilities for a particular group (or based on some group
characteristic): ===
{{{
add_filter( 'bp_groups_group_object_set_caps', 'my_edit_group_no_2_caps',
10, 2 );
function my_edit_group_no_2_caps( $caps, $partial_group_object ) {
// Members must request to join the group with the id of 2.
if ( 2 == $partial_group_object->id ) {
$caps['join_method'] = 'accepts_membership_requests';
}
return $caps;
}
}}}
=== Check the capability for a particular group by passing the group
object into the following function: ===
`$who_can_access = bp_groups_group_has_cap( $group, 'access_group' );`
== Caveats: ==
=== Custom statuses or very changed statuses will cause unexpected
behavior in plugins that are checking the status for the three basic
statuses: public, private, or hidden. ===
We'd need to get group-related plugins updated like this:
For instance, code that decided whether to create a public activity post
like this:
{{{
if ( 'public' === $group->status ) {
# do the thing
}
}}}
might become
{{{
if ( version_compare( bp_get_version(), '2.7', '>=' ) ) {
if ( 'anyone' != bp_groups_group_has_cap( $group, 'access_group' ) ) {
# do the thing
}
} else {
if ( 'public' === $group->status ) {
# do the thing
}
}
}}}
=== Orphaned custom statuses will also produce unexpected results.===
It would be easy enough to build a status migration tool for the BP tools
screen that displays unregistered group statuses and asks the site admin
which status to migrate those groups to. But, this could be kind of
awkward. We could also store a group's capabilities as a groupmeta item,
but that has the disadvantage of requiring meta lookups. (Then the issue
could be the group's status and the stored capability meta could get out
of sync.)
To provide more granular visibility and access, I’ve added a potentially
expensive routine `get_hidden_group_ids()` in `BP_Groups_Group` and
`BP_Groups_Members`. The results are cached, but I’ll have to test this on
a site with many users and groups to see if it’s viable.
=== Other changes: ===
I added two new parameters to the BP_Groups_Group object: `is_visible` and
`user_has_access` which reflect the current user's relationship to the
group.
Because of the caveats, I'm not entirely sold on this approach, but I'm
putting it forward so we can figure out how to improve on it or do
something smarter.
--
Ticket URL: <https://buddypress.trac.wordpress.org/ticket/6677#comment:5>
BuddyPress Trac <http://buddypress.org/>
BuddyPress Trac
More information about the buddypress-trac
mailing list