-
-
Save imath/47c26997076f9c4b8171 to your computer and use it in GitHub Desktop.
A more granlar privacy based on member types
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 = '—'; | |
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( '— No change —', '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