/** * Adds or removes users to/from groups. */ public static function load_users() { if (current_user_can(GROUPS_ADMINISTER_GROUPS)) { $users = isset($_REQUEST['users']) ? $_REQUEST['users'] : null; $action = null; if (!empty($_REQUEST['groups'])) { if ($_GET['groups-action'] == "add-group") { $action = 'add'; } else { if ($_GET['groups-action'] == "remove-group") { $action = 'remove'; } } } if ($users !== null && $action !== null) { if (wp_verify_nonce($_REQUEST['bulk-user-group-nonce'], 'user-group')) { foreach ($users as $user_id) { switch ($action) { case 'add': $group_ids = isset($_GET['group_ids']) ? $_GET['group_ids'] : null; if ($group_ids !== null) { foreach ($group_ids as $group_id) { if (!Groups_User_Group::read($user_id, $group_id)) { Groups_User_Group::create(array('user_id' => $user_id, 'group_id' => $group_id)); } } } break; case 'remove': $group_ids = isset($_GET['group_ids']) ? $_GET['group_ids'] : null; if ($group_ids !== null) { foreach ($group_ids as $group_id) { if (Groups_User_Group::read($user_id, $group_id)) { Groups_User_Group::delete($user_id, $group_id); } } } break; } } $referer = wp_get_referer(); if ($referer) { $redirect_to = remove_query_arg(array('action', 'action2', 'add-to-group', 'bulk-user-group-nonce', 'group_id', 'new_role', 'remove-from-group', 'users'), $referer); wp_redirect($redirect_to); exit; } } } } }
/** * Adds or removes users to/from groups. */ public static function load_users() { if (current_user_can(GROUPS_ADMINISTER_GROUPS)) { $group_id = isset($_REQUEST['group_id']) ? $_REQUEST['group_id'] : null; $users = isset($_REQUEST['users']) ? $_REQUEST['users'] : null; $action = null; if (!empty($_REQUEST['add-to-group'])) { $action = 'add'; } else { if (!empty($_REQUEST['remove-from-group'])) { $action = 'remove'; } } if ($group_id !== null && $users !== null && $action !== null) { if (wp_verify_nonce($_REQUEST['bulk-user-group-nonce'], 'user-group')) { foreach ($users as $user_id) { switch ($action) { case 'add': if (!Groups_User_Group::read($user_id, $group_id)) { Groups_User_Group::create(array('user_id' => $user_id, 'group_id' => $group_id)); } break; case 'remove': if (Groups_User_Group::read($user_id, $group_id)) { Groups_User_Group::delete($user_id, $group_id); } break; } } } } } }
/** * Renders a form that lets a user leave a group. * * Attributes: * - "group" : (required) group name or id * * @param array $atts attributes * @param string $content not used */ public static function groups_leave($atts, $content = null) { $nonce_action = 'groups_action'; $nonce = 'nonce_leave'; $output = ""; $options = shortcode_atts(array('group' => '', 'display_message' => true, 'submit_text' => __('Leave the %s group', GROUPS_PLUGIN_DOMAIN)), $atts); extract($options); if ($display_message === 'false') { $display_message = false; } $group = trim($options['group']); $current_group = Groups_Group::read($group); if (!$current_group) { $current_group = Groups_Group::read_by_name($group); } if ($current_group) { if ($user_id = get_current_user_id()) { $submitted = false; $invalid_nonce = false; if (!empty($_POST['groups_action']) && $_POST['groups_action'] == 'leave') { $submitted = true; if (!wp_verify_nonce($_POST[$nonce], $nonce_action)) { $invalid_nonce = true; } } if ($submitted && !$invalid_nonce) { // remove user from group if (isset($_POST['group_id'])) { $leave_group = Groups_Group::read($_POST['group_id']); Groups_User_Group::delete($user_id, $leave_group->group_id); } } if (Groups_User_Group::read($user_id, $current_group->group_id)) { $submit_text = sprintf($options['submit_text'], wp_filter_nohtml_kses($current_group->name)); $output .= '<div class="groups-join">'; $output .= '<form action="#" method="post">'; $output .= '<input type="hidden" name="groups_action" value="leave" />'; $output .= '<input type="hidden" name="group_id" value="' . esc_attr($current_group->group_id) . '" />'; $output .= '<input type="submit" value="' . $submit_text . '" />'; $output .= wp_nonce_field($nonce_action, $nonce, true, false); $output .= '</form>'; $output .= '</div>'; } else { if ($display_message) { if ($submitted && !$invalid_nonce && isset($leave_group) && $leave_group->group_id === $current_group->group_id) { $output .= '<div class="groups-join left">'; $output .= sprintf(__('You have left the %s group.', GROUPS_PLUGIN_DOMAIN), wp_filter_nohtml_kses($leave_group->name)); $output .= '</div>'; } } } } } return $output; }
/** * Updates the group membership. * @param int $user_id */ public static function edit_user_profile_update($user_id) { global $wpdb; if (current_user_can(GROUPS_ADMINISTER_GROUPS)) { $groups_table = _groups_get_tablename('group'); if ($groups = $wpdb->get_results("SELECT * FROM {$groups_table}")) { $user_group_ids = isset($_POST['group_ids']) && is_array($_POST['group_ids']) ? $_POST['group_ids'] : array(); foreach ($groups as $group) { if (in_array($group->group_id, $user_group_ids)) { if (!Groups_User_Group::read($user_id, $group->group_id)) { Groups_User_Group::create(array('user_id' => $user_id, 'group_id' => $group->group_id)); } } else { if (Groups_User_Group::read($user_id, $group->group_id)) { Groups_User_Group::delete($user_id, $group->group_id); } } } } } }
/** * Execute membership termination. * @param int $user_id * @param int $group_id */ public static function terminate_membership($user_id, $group_id) { if (GROUPS_WS_LOG) { error_log(sprintf(__METHOD__ . ' testing for user ID %d with group ID %d', $user_id, $group_id)); } require_once GROUPS_WS_CORE_LIB . '/class-groups-ws-bucket.php'; $b = new Groups_WS_Bucket($user_id, $group_id); $b->acquire(); $B = $b->content; $t1 = time(); $P = array(); foreach ($B as $t) { if ($t <= $t1 && $t !== self::ETERNITY) { $P[] = $t; } } $U_in_G = false; $groups_user = new Groups_User($user_id); foreach ($groups_user->groups as $group) { if ($group->group_id === $group_id) { $U_in_G = true; break; } } if ($U_in_G) { if (count($P) > 0) { if (count($B) == count($P)) { Groups_User_Group::delete($user_id, $group_id); if (GROUPS_WS_LOG) { error_log(sprintf(__METHOD__ . ' terminated membership for user ID %d with group ID %d', $user_id, $group_id)); } $B = array(); } else { $B = array_diff($B, $P); } } } else { $B = array_diff($B, $P); } $b->content = $B; $b->release(); }
/** * Same as when a subscription is cancelled. * @param int $user_id * @param string $subscription_key */ public static function subscription_expired($user_id, $subscription_key) { $subscription = WC_Subscriptions_Manager::get_users_subscription($user_id, $subscription_key); if (isset($subscription['product_id']) && isset($subscription['order_id'])) { $product_id = $subscription['product_id']; $order_id = $subscription['order_id']; $groups_product_groups = get_user_meta($user_id, '_groups_product_groups', true); if (isset($groups_product_groups[$order_id]) && isset($groups_product_groups[$order_id][$product_id]) && isset($groups_product_groups[$order_id][$product_id]['groups'])) { foreach ($groups_product_groups[$order_id][$product_id]['groups'] as $group_id) { Groups_User_Group::delete($user_id, $group_id); } } } }
/** * Deletes the user from the group if no other orders than $order_id * currently grant membership to that group. * * @param int $user_id * @param int $group_id * @param int $order_id */ public static function maybe_delete($user_id, $group_id, $order_id) { $order_ids = self::get_valid_order_ids_granting_group_membership_from_order_items($user_id, $group_id); $ids = array_diff($order_ids, array($order_id)); if (count($ids) == 0) { Groups_User_Group::delete($user_id, $group_id); if (GROUPS_WS_LOG) { error_log(sprintf(__METHOD__ . ' deleted membership for user ID %d with group ID %d', $user_id, $group_id)); } } else { if (GROUPS_WS_LOG) { error_log(sprintf(__METHOD__ . ' membership for user ID %d with group ID %d has not been deleted due to other orders granting membership, order IDs: %s', $user_id, $group_id, implode(',', $order_ids))); } } }