permissions->isAdministrator(get_current_user_id())) { // Bulk edit inside the users list. add_filter('bulk_actions-users', array($this, 'bulk_actions_users'), 20); add_filter('handle_bulk_actions-users', array($this, 'handle_bulk_actions_users'), 10, 3); add_action('admin_notices', array($this, 'bulk_actions_admin_notices')); } } public static function initializeTaxonomy() { // Register the taxonomies. register_taxonomy( self::$taxonomyName, null, array( 'public' => false, 'hierarchical' => true, 'rewrite' => false ) ); self::$taxonomyName = apply_filters('asgarosforum_filter_user_groups_taxonomy_name', self::$taxonomyName); } //====================================================================== // FUNCTIONS FOR INSERTING CONTENT. //====================================================================== // Adds a new usergroup. public static function insertUserGroup($category_id, $name, $color = '#444444', $visibility = 'normal', $auto_add = 'no', $icon = '') { $name = trim($name); $color = trim($color); $visibility = trim($visibility); $auto_add = trim($auto_add); $icon = trim($icon); $status = wp_insert_term($name, self::$taxonomyName, array('parent' => $category_id)); // Return possible error. if (is_wp_error($status)) { return $status; } $usergroup_id = $status['term_id']; $status = self::updateUserGroupColor($usergroup_id, $color); // Return possible error. if (is_wp_error($status)) { return $status; } $status = self::update_usergroup_visibility($usergroup_id, $visibility); $status = self::update_usergroup_auto_add($usergroup_id, $auto_add); $status = self::update_usergroup_icon($usergroup_id, $icon); return $status; } public static function insertUserGroupCategory($categoryName) { $categoryName = trim($categoryName); $status = wp_insert_term($categoryName, self::$taxonomyName); return $status; } public static function insertUserGroupsOfForumCategory($forumCategoryID, $user_group_ids) { // Only assign usergroup-IDs to a forum category when there are some. Otherwise delete them all. if (!empty($user_group_ids)) { update_term_meta($forumCategoryID, 'usergroups', $user_group_ids); } else { self::deleteUserGroupsOfForumCategory($forumCategoryID); } } // Assign an user to all given usergroups. The user gets removed from usergroups which are not inside the array anymore. public static function insertUserGroupsOfUsers($user_id, $usergroups) { // Get all current usergroups of the user first which allows us to run specific hooks. $current_usergroups = self::getUserGroupsOfUser($user_id, 'ids'); if (!empty($usergroups)) { wp_set_object_terms($user_id, $usergroups, self::$taxonomyName); clean_object_term_cache($user_id, self::$taxonomyName); } else { self::deleteUserGroupsOfUser($user_id); } // Run hooks for adding the user to a specific group. foreach ($usergroups as $usergroup) { if (!in_array($usergroup, $current_usergroups)) { do_action('asgarosforum_usergroup_'.$usergroup.'_add_user', $user_id, $usergroup); } } // Run hooks for removing the user from a specific group. foreach ($current_usergroups as $usergroup) { if (!in_array($usergroup, $usergroups)) { do_action('asgarosforum_usergroup_'.$usergroup.'_remove_user', $user_id, $usergroup); } } } //====================================================================== // FUNCTIONS FOR UPDATING CONTENT. //====================================================================== public static function updateUserGroup($usergroup_id, $category_id, $name, $color = '#444444', $visibility = 'normal', $auto_add = 'no', $icon = '') { $name = trim($name); $color = trim($color); $visibility = trim($visibility); $auto_add = trim($auto_add); $icon = trim($icon); $status = wp_update_term($usergroup_id, self::$taxonomyName, array('parent' => $category_id, 'name' => $name)); // Return possible error. if (is_wp_error($status)) { return $status; } $status = self::updateUserGroupColor($usergroup_id, $color); // Return possible error. if (is_wp_error($status)) { return $status; } $status = self::update_usergroup_visibility($usergroup_id, $visibility); $status = self::update_usergroup_auto_add($usergroup_id, $auto_add); $status = self::update_usergroup_icon($usergroup_id, $icon); return $status; } public static function updateUserGroupCategory($categoryID, $categoryName) { $categoryName = trim($categoryName); $status = wp_update_term($categoryID, self::$taxonomyName, array('name' => $categoryName)); return $status; } public static function updateUserGroupColor($userGroupID, $userGroupColor) { $userGroupColor = trim($userGroupColor); $userGroupColor = (empty($userGroupColor)) ? '#444444' : $userGroupColor; $status = update_term_meta($userGroupID, 'usergroup-color', $userGroupColor); return $status; } public static function update_usergroup_visibility($usergroup_id, $usergroup_visibility) { $usergroup_visibility = trim($usergroup_visibility); $usergroup_visibility = (empty($usergroup_visibility)) ? 'normal' : $usergroup_visibility; $status = update_term_meta($usergroup_id, 'usergroup-visibility', $usergroup_visibility); return $status; } public static function update_usergroup_auto_add($usergroup_id, $usergroup_auto_add) { $usergroup_auto_add = trim($usergroup_auto_add); $usergroup_auto_add = (empty($usergroup_auto_add)) ? 'no' : $usergroup_auto_add; $status = update_term_meta($usergroup_id, 'usergroup-auto-add', $usergroup_auto_add); return $status; } public static function update_usergroup_icon($usergroup_id, $icon) { $icon = trim($icon); $status = update_term_meta($usergroup_id, 'usergroup-icon', $icon); return $status; } //====================================================================== // FUNCTIONS FOR DELETING CONTENT. //====================================================================== public static function deleteUserGroup($userGroupID) { wp_delete_term($userGroupID, self::$taxonomyName); } public static function deleteUserGroupCategory($categoryID) { // Get all usergroups of the category first. $userGroups = self::getUserGroupsOfCategory($categoryID); // Delete all usergroups of the category. foreach ($userGroups as $group) { self::deleteUserGroup($group->term_id); } // Now delete the category. wp_delete_term($categoryID, self::$taxonomyName); } public static function deleteUserGroupsOfForumCategory($forumCategoryID) { delete_term_meta($forumCategoryID, 'usergroups'); } public static function deleteUserGroupsOfUser($userID) { wp_delete_object_term_relationships($userID, self::$taxonomyName); clean_object_term_cache($userID, self::$taxonomyName); } //====================================================================== // FUNCTIONS FOR GETTING CONTENT. //====================================================================== // Returns a specific usergroup. public static function getUserGroup($userGroupID) { return get_term($userGroupID, self::$taxonomyName); } // Returns all or specific usergroups. public static function getUserGroups($include = array(), $visible_groups_only = false) { $userGroups = false; // First load all terms. if ($visible_groups_only) { $userGroups = get_terms(self::$taxonomyName, array('hide_empty' => false, 'include' => $include, 'meta_key' => 'usergroup-visibility', 'meta_value' => 'normal')); } else { $userGroups = get_terms(self::$taxonomyName, array('hide_empty' => false, 'include' => $include)); } // Now remove the categories so we only have usergroups. $userGroups = array_filter($userGroups, array('AsgarosForumUserGroups', 'getUserGroupsArrayFilter')); return $userGroups; } // Explicit callback function for array_filter() to support older versions of PHP. public static function getUserGroupsArrayFilter($term) { return ($term->parent != 0); } // Returns all usergroups of a specific category. public static function getUserGroupsOfCategory($categoryID) { return get_terms(self::$taxonomyName, array('hide_empty' => false, 'parent' => $categoryID)); } // Returns all usergroups categories. public static function getUserGroupCategories($hide_empty = false) { $userGroupCategories = get_terms(self::$taxonomyName, array('hide_empty' => false, 'parent' => 0)); // Hide categories without usergroups. if ($hide_empty) { foreach ($userGroupCategories as $key => $category) { $userGroupsInCategory = self::getUserGroupsOfCategory($category->term_id); if (empty($userGroupsInCategory)) { unset($userGroupCategories[$key]); } } } return $userGroupCategories; } // Returns all usergroups of an user. public static function getUserGroupsOfUser($userID, $fields = 'all', $filter_hidden = false) { $usergroups_of_user = wp_get_object_terms($userID, self::$taxonomyName, array('fields' => $fields)); // Remove hidden usergroups. if ($filter_hidden) { foreach ($usergroups_of_user as $key => $value) { $visibility = self::get_usergroup_visibility($value->term_id); if ($visibility === 'hidden') { unset($usergroups_of_user[$key]); } } } return $usergroups_of_user; } // Returns the color of an usergroup. public static function getUserGroupColor($userGroupID) { return get_term_meta($userGroupID, 'usergroup-color', true); } // Returns the visibility of an usergroup. public static function get_usergroup_visibility($usergroup_id) { return get_term_meta($usergroup_id, 'usergroup-visibility', true); } // Returns the auto add setting of an usergroup. public static function get_usergroup_auto_add($usergroup_id) { return get_term_meta($usergroup_id, 'usergroup-auto-add', true); } // Returns the icon of an usergroup. public static function get_usergroup_icon($usergroup_id) { $icon = get_term_meta($usergroup_id, 'usergroup-icon', true); if (empty($icon)) { $icon = false; } return $icon; } // Returns all usergroups of a specific forum category. public static function getUserGroupsOfForumCategory($forumCategoryID) { $userGroupsIDs = self::getUserGroupsIDsOfForumCategory($forumCategoryID); if (!empty($userGroupsIDs)) { return self::getUserGroups($userGroupsIDs); } return false; } // Returns all usergroups IDs of a specific forum category. public static function getUserGroupsIDsOfForumCategory($forumCategoryID) { return get_term_meta($forumCategoryID, 'usergroups', true); } // Returns all users of a usergroup. public static function get_ids_of_users_in_usergroup($userGroupID) { return get_objects_in_term($userGroupID, self::$taxonomyName); } public static function get_users_in_usergroup($usergroup_id) { // Get IDs first. $user_ids = self::get_ids_of_users_in_usergroup($usergroup_id); if (!empty($user_ids)) { $query = new AsgarosForumUserQuery(array( 'fields' => array('ID', 'display_name'), 'include' => $user_ids )); return $query->results; } return false; } //====================================================================== // MORE FUNCTIONS. //====================================================================== // Checks if a specific user can access a specific forum category. public static function canUserAccessForumCategory($userID, $forumCategoryID) { // Default status is true. $canAccess = true; // We only need to check the access when the user is not an administrator. if (!self::$asgarosforum->permissions->isAdministrator($userID)) { // Get usergroups IDs of a forum category first. $userGroupsIDsOfForumCategory = self::getUserGroupsIDsOfForumCategory($forumCategoryID); // Only continue the check when there are usergroups IDs for a forum category. if (!empty($userGroupsIDsOfForumCategory)) { // Now get the usergroups IDs of a user. $userGroupsIDsOfUser = self::getUserGroupsOfUser($userID, 'ids'); // Get the insersection. $intersection = array_intersect($userGroupsIDsOfForumCategory, $userGroupsIDsOfUser); // When the intersection is empty, the user cant access the forum category. if (empty($intersection)) { $canAccess = false; } } } return $canAccess; } // Checks if a user is in a specific usergroup. public static function isUserInUserGroup($userID, $userGroupID) { return is_object_in_term($userID, self::$taxonomyName, $userGroupID); } // Counts the users of an usergroup. public static function countUsersOfUserGroup($userGroupID) { return count(self::get_ids_of_users_in_usergroup($userGroupID)); } //====================================================================== // ADDITIONAL FUNCTIONS. //====================================================================== // Users List in Administration. public function manageUsersColumns($columns) { $columns['forum-user-groups'] = __('Forum Usergroups', 'asgaros-forum'); return $columns; } public function manageUsersCustomColumn($output, $column_name, $user_id) { if ($column_name === 'forum-user-groups') { $usergroups = self::getUserGroupsOfUser($user_id); if (!empty($usergroups)) { foreach ($usergroups as $usergroup) { $link = add_query_arg(array('forum-user-group' => $usergroup->term_id), admin_url('users.php')); $output .= ''; $output .= self::render_usergroup_tag($usergroup); $output .= ''; } } } return $output; } public static function saveUserGroup() { // Ensure usergroup-ID is set. if (empty($_POST['usergroup_id'])) { return; } $usergroup_id = sanitize_key($_POST['usergroup_id']); // Ensure usergroup-name is set. if (empty($_POST['usergroup_name'])) { return; } $usergroup_name = sanitize_text_field($_POST['usergroup_name']); // Ensure usergroup-category is set. if (empty($_POST['usergroup_category'])) { return; } $usergroup_category = sanitize_key($_POST['usergroup_category']); // Set other values. $usergroup_color = sanitize_hex_color($_POST['usergroup_color']); $usergroup_visibility = (isset($_POST['usergroup_visibility'])) ? 'hidden' : 'normal'; $usergroup_auto_add = (isset($_POST['usergroup_auto_add'])) ? 'yes' : 'no'; $usergroup_icon = sanitize_text_field($_POST['usergroup_icon']); if ($usergroup_id === 'new') { return self::insertUserGroup($usergroup_category, $usergroup_name, $usergroup_color, $usergroup_visibility, $usergroup_auto_add, $usergroup_icon); } else { return self::updateUserGroup($usergroup_id, $usergroup_category, $usergroup_name, $usergroup_color, $usergroup_visibility, $usergroup_auto_add, $usergroup_icon); } } public static function saveUserGroupCategory() { $category_id = sanitize_key($_POST['usergroup_category_id']); $category_name = sanitize_text_field($_POST['usergroup_category_name']); if ($category_id === 'new') { return self::insertUserGroupCategory($category_name); } else { return self::updateUserGroupCategory($category_id, $category_name); } } // Adds a new usergroups string to the structure page. public static function renderUserGroupsInCategory($categoryID) { $userGroupsOfForumCategory = self::getUserGroupsOfForumCategory($categoryID); if (!empty($userGroupsOfForumCategory)) { echo ' · '.esc_html__('Usergroups:', 'asgaros-forum').' '; foreach ($userGroupsOfForumCategory as $key => $userGroup) { if ($key > 0) { echo ', '; } echo esc_html($userGroup->name); } } } public static function renderCategoryEditorFields() { $userGroupCategories = self::getUserGroupCategories(true); if (!empty($userGroupCategories)) { echo '
'.esc_html__('Usergroups assignments updated.', 'asgaros-forum').'