Skip to content

Instantly share code, notes, and snippets.

@imath
Created April 20, 2015 13:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save imath/47c26997076f9c4b8171 to your computer and use it in GitHub Desktop.
Save imath/47c26997076f9c4b8171 to your computer and use it in GitHub Desktop.
A more granlar privacy based on member types
<?php
/**
* BuddyPress Custom
*
* A more granlar privacy based on member types
*/
// Exit if accessed directly
defined( 'ABSPATH' ) || exit;
// Do not create a user on registration
define( 'BP_SIGNUPS_SKIP_USER_CREATION', true );
// Only activate Members component
function imath_restrict_default_component( $default = array() ) {
return array_intersect_key( array(
'members' => 1,
), $default );
}
add_filter( 'bp_new_install_default_components', 'imath_restrict_default_component', 10, 1 );
// Only allow register and activate actions
function imath_disable_members_directory( $bool, $component = '' ) {
if ( 'register' != $component && 'activate' != $component ) {
return false;
}
return $bool;
}
add_filter( 'bp_is_current_component', 'imath_disable_members_directory', 10, 2 );
// Only allow register and activate actions
function imath_disable_buddypress_front_end() {
if ( is_buddypress() && ! bp_is_register_page() && ! bp_is_activation_page() ) {
bp_do_404();
return;
}
}
add_action( 'bp_actions', 'imath_disable_buddypress_front_end', 1 );
// Exclude members directory from the list of pages
function imath_exclude_members_directory_page( $pages = array() ) {
$pages[] = buddypress()->pages->members->id;
return $pages;
}
add_filter( 'bp_core_exclude_pages', 'imath_exclude_members_directory_page', 10, 1 );
// Disallow the submit metabox if current user is not a super admin
function imath_disable_members_admin_major_metabox() {
if ( bp_current_user_can( 'bp_moderate' ) ) {
return;
}
remove_meta_box( 'submitdiv', get_current_screen(), 'side' );
}
add_action( 'bp_members_admin_user_metaboxes', 'imath_disable_members_admin_major_metabox' );
// Register some member types
function imath_register_member_types() {
bp_register_member_type( 'lead', array(
'labels' => array(
'name' => 'Lead Developers',
'singular_name' => 'Lead Developer',
),
) );
bp_register_member_type( 'core', array(
'labels' => array(
'name' => 'Core Developers',
'singular_name' => 'Core Developer',
),
) );
}
add_action( 'bp_init', 'imath_register_member_types' );
// Add a column for Page post type edit screen
function imath_wp_list_table_column_header( $columns = array() ) {
$columns['restrict_mt'] = __( 'Private allowed for', 'text-domain' );
return $columns;
}
add_filter( 'manage_pages_columns', 'imath_wp_list_table_column_header', 10, 1 );
// Add data for the member type column
function imath_wp_list_table_column_data( $column_name = '', $post_id = 0 ) {
if ( 'restrict_mt' !== $column_name ) {
return;
}
$status = get_post_status( $post_id );
$output = '&#8212;';
if ( 'private' !== $status ) {
echo $output;
} else {
$member_type_name = get_post_meta( $post_id, '_page_allowed_member_type', true );
if ( empty( $member_type_name ) ) {
echo $output;
return;
}
$member_type_object = bp_get_member_type_object( $member_type_name );
if ( empty( $member_type_object ) ) {
echo $output;
} else {
echo esc_html( $member_type_object->labels['name'] );
}
}
}
add_action( 'manage_pages_custom_column', 'imath_wp_list_table_column_data', 10, 2 );
// Map capabilities to member type if needed
function imath_map_cap_to_member_type( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
if ( empty( $user_id ) ) {
return $caps;
}
$is_private_page_caps = array_flip( $caps );
if ( ! isset( $is_private_page_caps['read_private_pages'] ) || empty( $args[0] ) ) {
return $caps;
}
$_page = get_post( $args[0] );
if ( empty( $_page ) || 'page' !== $_page->post_type ) {
return $caps;
}
$allowed_member_type = get_post_meta( $_page->ID, '_page_allowed_member_type', true );
if ( ! empty( $allowed_member_type ) && $allowed_member_type === bp_get_member_type( $user_id ) ) {
$caps = array( 'read' );
}
return $caps;
}
add_filter( 'map_meta_cap', 'imath_map_cap_to_member_type', 10, 4 );
// Hide private pages from menu if the current user can't access to them
function imath_get_nav_menu_items( $items = array() ) {
foreach ( $items as $key_item => $item ) {
if ( 'page' !== $item->object ) {
continue;
}
if ( 'private' !== get_post_status( $item->object_id ) ) {
continue;
}
if ( ! current_user_can( 'read_private_pages', $item->object_id ) ) {
unset( $items[ $key_item ] );
}
}
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'imath_get_nav_menu_items', 10, 1 );
// Add a quick edit field for pages
function imath_quick_edit_page_member_type( $column_name = '', $post_type = '' ) {
if ( 'restrict_mt' !== $column_name || 'page' !== $post_type ) {
return;
}
$member_types = bp_get_member_types( array(), 'objects' );
if ( empty( $member_types ) ) {
return;
}
?>
<fieldset class="inline-edit-col-right">
<div class="inline-edit-col">
<div class="inline-edit-group">
<label class="alignleft">
<span class="title"><?php _e( 'Allow private to' ); ?></span>
<select name="_page_allowed_member_type">
<option value=""><?php esc_html_e( '&#8212; No change &#8212;', 'text-domain' ) ;?></option>
<?php foreach ( $member_types as $type_key => $type ) : ?>
<option value="<?php echo esc_attr( $type_key );?>"><?php echo esc_html( $type->labels['singular_name'] ); ?></option>
<?php endforeach ; ?>
</select>
</label>
</div>
</div>
</fieldset>
<?php
}
add_action( 'quick_edit_custom_box', 'imath_quick_edit_page_member_type', 10, 2 );
// Save the private page's member type
function imath_save_page_member_type( $post_ID = 0, $page = null, $update = false ) {
if ( ! isset( $_POST['_page_allowed_member_type'] ) || empty( $page->post_status ) || 'private' !== $page->post_status ) {
return;
}
$member_type = sanitize_key( $_POST['_page_allowed_member_type'] );
if ( empty( $update ) ) {
update_post_meta( $page->ID, '_page_allowed_member_type', $member_type );
} else {
if ( empty( $_POST['_page_allowed_member_type'] ) ) {
delete_post_meta( $page->ID, '_page_allowed_member_type' );
} else {
update_post_meta( $page->ID, '_page_allowed_member_type', $member_type );
}
}
}
add_action( 'save_post_page', 'imath_save_page_member_type', 10, 3 );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment