wpmudev-sls
3/24/2018 - 9:07 AM

Remove Users from BuddyPress Groups where user is member of specific m2p membership or with no membership

Remove Users from BuddyPress Groups where user is member of specific m2p membership or with no membership

<?php

/**
* Plugin Name: Remove m2p Specific Members From BuddyPress Groups
* Plugin URI: https://premium.wpmudev.org/
* Description: Remove Users from BuddyPress Groups where user is member of specific m2p membership or with no membership
* Author: Ariful Islam @ WPMUDEV
* Author URI: https://premium.wpmudev.org/profile/itsarifulislam
* License: GPLv2 or later
*/


if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


if ( ! class_exists( 'M2PMembersRemoveFromBuddyPressGroups' ) ) {

	class M2PMembersRemoveFromBuddyPressGroups {

		private static $_instance 	= null;

		private $escape_admin_user 	= true; // For remove admin user

		private $wp_user_ids 		= []; // All WP User IDs

		private $m2p_user_ids 		= []; // User IDs who have m2p membership

		private $no_m2p_user_ids 	= []; // User IDs who have no m2p membership

		private $user_ids 			= []; // For remove from bp groups

		private $m2p_membership_ids = []; // For get users ids of specific memberships

		
		public static function get_instance() {

			if ( is_null( self::$_instance ) ) {
				self::$_instance = new M2PMembersRemoveFromBuddyPressGroups();
			}

			return self::$_instance;

		}

		private function __construct() {

			if ( !class_exists('BuddyPress') || !class_exists('MS_Factory') ) return;

			// Fix buddyPress undefined table names
			$this->fix_bp_missing_table_names();

			// Set all wp user ids
			$this->set_wp_user_ids();

			// Set m2p and no mp2 user ids
			$this->set_m2p_and_no_m2p_user_ids();

			// Set m2p membership ids manually for get these specific membership users ids
			$this->set_m2p_membership_ids();

			// Set specific users ids which is under specific m2p memberships
			// Disable it if you not like to remove these users from buddyPress
			$this->set_specific_m2p_membership_user_ids();

			// Set specific users ids which is not under any m2p membership
			// Disable it if you not like to remove these users from buddyPress
			$this->set_no_m2p_membership_user_ids();

			// Remove specific users from buddyPress all groups
			// Disable it if you not like to remove specific users from buddyPress
			$this->remove_users_from_buddyPress_groups();
			
		}

		public function fix_bp_missing_table_names() {

			global $wpdb;

			$bp = BuddyPress::instance();

			if ( empty($bp->groups->table_name) ) {
				$bp->groups->table_name           = $wpdb->prefix . 'bp_groups';
				$bp->groups->table_name_members   = $wpdb->prefix . 'bp_groups_members';
				$bp->groups->table_name_groupmeta = $wpdb->prefix . 'bp_groups_groupmeta';
			}

		}

		public function set_m2p_membership_ids() {

			$membership_ids = array(); // provide m2p specific membersihp ids like: array(2,5,8)
			$this->m2p_membership_ids = array_merge( $this->m2p_membership_ids, $membership_ids );

		}

		public function set_wp_user_ids() {

			global $wpdb;

			if ( $wp_user_ids = $wpdb->get_results( "SELECT `id` FROM {$wpdb->prefix}users", ARRAY_A ) ) {
				$this->wp_user_ids = array_merge( $this->wp_user_ids, wp_list_pluck( $wp_user_ids, 'id') );
			}

		}

		public function set_m2p_and_no_m2p_user_ids() {

			$members = array_map(function($user_id) {
				return MS_Factory::load( 'MS_Model_Member', $user_id );
			}, $this->wp_user_ids);

			foreach ($members as $member) {
				if ( $this->escape_admin_user && $member->is_admin_user($member->id) ) continue;
				$member->has_membership() ? $this->m2p_user_ids[] = $member->id : $this->no_m2p_user_ids[] = $member->id;
			}

		}
		
		public function set_specific_m2p_membership_user_ids() {

			$members = array_map(function($user_id) {
				return MS_Factory::load( 'MS_Model_Member', $user_id );
			}, $this->m2p_user_ids);

			$user_ids = array();

			foreach ($members as $member) {
				foreach ( $member->get_membership_ids() as $ms_id ) {
					if ( !in_array($ms_id, $this->m2p_membership_ids) ) continue;
					$user_ids[] = $member->wp_user->ID;
				}
			}

			$this->user_ids = array_merge( $this->user_ids, $user_ids );

		}

		public function set_no_m2p_membership_user_ids() {

			$this->user_ids = array_merge( $this->user_ids, $this->no_m2p_user_ids );

		}

		public function remove_users_from_buddyPress_groups() {

			foreach ($this->user_ids as $user_id) {

				if ( $bp_groups = BP_Groups_Member::get_group_ids( $user_id ) ) {
					foreach ( $bp_groups['groups'] as $group_id) {
						BP_Groups_Member::delete($user_id, $group_id);
					}
				}
			}

		}

	}


	function render_M2P_members_remove_from_buddyPress_groups(){

		$GLOBALS['M2PMembersRemoveFromBuddyPressGroups'] = M2PMembersRemoveFromBuddyPressGroups::get_instance();

	}

}

add_action( 'wp_loaded', 'render_M2P_members_remove_from_buddyPress_groups' );