508 lines
19 KiB
PHP
508 lines
19 KiB
PHP
<?php
|
|
// Exit if accessed directly
|
|
if( !defined( 'ABSPATH' ) ) exit;
|
|
|
|
class wpForoUsergroup{
|
|
public $default;
|
|
public $default_groupid;
|
|
public $cans;
|
|
public $current;
|
|
private $post_flood_intervals;
|
|
|
|
static $cache = array( 'usergroup' => array(), 'user' => array(), 'user_second' => array() );
|
|
|
|
function __construct(){
|
|
$this->init_defaults();
|
|
$this->init_options();
|
|
$this->init_hooks();
|
|
}
|
|
|
|
private function init_defaults(){
|
|
$this->default = new stdClass;
|
|
|
|
$this->default->default_groupid = 3;
|
|
|
|
$this->default->group = array(
|
|
'groupid' => 0,
|
|
'name' => '',
|
|
'cans' => '',
|
|
'description' => '',
|
|
'utitle' => '',
|
|
'role' => '',
|
|
'access' => '',
|
|
'color' => '',
|
|
'visible' => 0,
|
|
'secondary' => 0
|
|
);
|
|
|
|
$this->default->post_flood_intervals = array(
|
|
0 => 0,
|
|
1 => 0,
|
|
2 => 0,
|
|
3 => 0,
|
|
4 => 0,
|
|
5 => 0
|
|
);
|
|
|
|
$this->default->cans = array(
|
|
'mf' => __( 'Dashboard - Manage Forums', 'wpforo' ),
|
|
'ms' => __( 'Dashboard - Manage Settings', 'wpforo' ),
|
|
'mt' => __( 'Dashboard - Manage Tools', 'wpforo' ),
|
|
'vm' => __( 'Dashboard - Manage Members', 'wpforo' ),
|
|
'aum' => __( 'Dashboard - Moderate Topics & Posts', 'wpforo' ),
|
|
'vmg' => __( 'Dashboard - Manage Usergroups', 'wpforo' ),
|
|
'mp' => __( 'Dashboard - Manage Phrases', 'wpforo' ),
|
|
'mth' => __( 'Dashboard - Manage Themes', 'wpforo' ),
|
|
|
|
'em' => __( 'Dashboard - Can edit member', 'wpforo' ),
|
|
'bm' => __( 'Dashboard - Can ban member', 'wpforo' ),
|
|
'dm' => __( 'Dashboard - Can delete member', 'wpforo' ),
|
|
|
|
'aup' => __( 'Front - Can pass moderation', 'wpforo' ),
|
|
'view_stat' => __( 'Front - Can view statistic', 'wpforo' ),
|
|
'vmem' => __( 'Front - Can view members', 'wpforo' ),
|
|
'vprf' => __( 'Front - Can view profiles', 'wpforo' ),
|
|
'vpra' => __( 'Front - Can view member activity', 'wpforo' ),
|
|
'vprs' => __( 'Front - Can view member subscriptions', 'wpforo' ),
|
|
|
|
'upa' => __( 'Front - Can upload avatar', 'wpforo' ),
|
|
'ups' => __( 'Front - Can have signature', 'wpforo' ),
|
|
'va' => __( 'Front - Can view avatars', 'wpforo' ),
|
|
|
|
'vmu' => __( 'Front - Can view member username', 'wpforo' ),
|
|
'vmm' => __( 'Front - Can view member email', 'wpforo' ),
|
|
'vmt' => __( 'Front - Can view member title', 'wpforo' ),
|
|
'vmct' => __( 'Front - Can view member custom title', 'wpforo' ),
|
|
'vmr' => __( 'Front - Can view member reputation', 'wpforo' ),
|
|
'vmw' => __( 'Front - Can view member website', 'wpforo' ),
|
|
'vmsn' => __( 'Front - Can view member social networks', 'wpforo' ),
|
|
'vmrd' => __( 'Front - Can view member reg. date', 'wpforo' ),
|
|
'vml' => __( 'Front - Can view member location', 'wpforo' ),
|
|
'vmo' => __( 'Front - Can view member occupation', 'wpforo' ),
|
|
'vms' => __( 'Front - Can view member signature', 'wpforo' ),
|
|
'vmam' => __( 'Front - Can view member about me', 'wpforo' ),
|
|
'vwpm' => __( 'Front - Can write PM', 'wpforo' ),
|
|
'caa' => __( 'Front - Can access to attachments', 'wpforo' ),
|
|
'vt_add_topic' => __( 'Front - Can access to add topic page', 'wpforo' )
|
|
);
|
|
}
|
|
|
|
private function init_options(){
|
|
$this->default_groupid = get_wpf_option('wpforo_default_groupid', $this->default->default_groupid);
|
|
$this->post_flood_intervals = get_wpf_option('wpforo_post_flood_intervals', $this->default->post_flood_intervals);
|
|
$this->cans = apply_filters('wpforo_usergroup_cans', $this->default->cans);
|
|
}
|
|
|
|
public function init_current(){
|
|
if( !$this->current = $this->get_usergroup( WPF()->current_user_groupid ) ){
|
|
$this->current = $this->get_usergroup();
|
|
}
|
|
}
|
|
|
|
private function init_hooks(){
|
|
// add_action('wpforo_after_add_usergroup', array($this, 'after_add_edit_usergroup'));
|
|
// add_action('wpforo_after_edit_usergroup', array($this, 'after_add_edit_usergroup'));
|
|
}
|
|
|
|
public function get_flood_interval($groupid, $obj = 'post'){
|
|
$flood_interval = ( wpfkey($this->post_flood_intervals, $groupid) ? $this->post_flood_intervals[$groupid] : 3 );
|
|
return apply_filters('wpforo_usergroup_get_flood_interval', intval($flood_interval), $groupid, $obj);
|
|
}
|
|
|
|
public function fix_group($group){
|
|
$group = wpforo_array_args_cast_and_merge((array) $group, $this->default->group);
|
|
$cans = array_map('__return_zero', $this->cans);
|
|
$group['cans'] = maybe_unserialize($group['cans']);
|
|
if( is_array($group['cans']) ){
|
|
$group['cans'] = wpforo_array_args_cast_and_merge($group['cans'], $cans);
|
|
}else{
|
|
$group['cans'] = $cans;
|
|
}
|
|
return $group;
|
|
}
|
|
|
|
function usergroup_list_data(){
|
|
$ugdata = array();
|
|
$groups = WPF()->db->get_results('SELECT * FROM '.WPF()->tables->usergroups.' ORDER BY `name` ', ARRAY_A);
|
|
foreach($groups as $group){
|
|
$user_count = WPF()->db->get_var("SELECT COUNT(*) FROM ".WPF()->tables->profiles." WHERE `groupid` = " . intval($group['groupid']) . " OR FIND_IN_SET(" . intval($group['groupid']) . ", `secondary_groups`)");
|
|
$ugdata[$group['groupid']]['groupid'] = intval($group['groupid']);
|
|
$ugdata[$group['groupid']]['name'] = wpforo_phrase($group['name'], FALSE);
|
|
$ugdata[$group['groupid']]['role'] = $group['role'];
|
|
$ugdata[$group['groupid']]['count'] = intval($user_count);
|
|
$ugdata[$group['groupid']]['access'] = $group['access'];
|
|
$ugdata[$group['groupid']]['color'] = $group['color'];
|
|
$ugdata[$group['groupid']]['secondary'] = $group['secondary'];
|
|
}
|
|
return $ugdata;
|
|
}
|
|
|
|
function add($title, $cans = array(), $description = '', $role = 'subscriber', $access = 'standard', $color = '', $visible = 1, $secondary = 0 ){
|
|
$i = 2;
|
|
$real_title = $title;
|
|
while( WPF()->db->get_var(
|
|
WPF()->db->prepare(
|
|
"SELECT `groupid` FROM `".WPF()->tables->usergroups."` WHERE `name` = %s",
|
|
sanitize_text_field($title)
|
|
)
|
|
)
|
|
){
|
|
$title = $real_title . '-' . $i;
|
|
$i++;
|
|
}
|
|
|
|
$group = array(
|
|
'name' => sanitize_text_field( $title ),
|
|
'cans' => serialize( wpforo_parse_args( $cans, array_map('__return_zero', $this->cans) ) ),
|
|
'description' => $description,
|
|
'utitle' => sanitize_text_field( $real_title ),
|
|
'role' => $role,
|
|
'access' => $access,
|
|
'color' => $color,
|
|
'visible' => $visible,
|
|
'secondary' => $secondary
|
|
);
|
|
|
|
if( WPF()->db->insert(
|
|
WPF()->tables->usergroups,
|
|
$group,
|
|
array('%s','%s','%s','%s','%s','%s','%s','%d','%d')
|
|
)){
|
|
$group['groupid'] = WPF()->db->insert_id;
|
|
|
|
do_action('wpforo_after_add_usergroup', $group);
|
|
|
|
WPF()->notice->add('User group successfully added', 'success');
|
|
return $group['groupid'];
|
|
}
|
|
|
|
WPF()->notice->add('User group add error', 'error');
|
|
return FALSE;
|
|
}
|
|
|
|
function edit( $groupid, $title, $cans, $description = '', $role = NULL, $access = NULL, $color = '', $visible = 1, $secondary = 0 ){
|
|
if( !WPF()->perm->usergroup_can('vmg') ){
|
|
WPF()->notice->add('Permission denied', 'error');
|
|
return FALSE;
|
|
}
|
|
|
|
if( $groupid = intval($groupid) ){
|
|
$old_group = $this->get_usergroup($groupid);
|
|
$group = array(
|
|
'name' => sanitize_text_field( $title ),
|
|
'cans' => serialize( wpforo_parse_args( $cans, array_map( '__return_zero', $this->cans ) ) ),
|
|
'description' => $description,
|
|
'utitle' => $old_group['utitle'],
|
|
'role' => is_null($role) ? $old_group['role'] : $role,
|
|
'access' => is_null($access) ? $old_group['access'] : $access,
|
|
'color' => $color,
|
|
'visible' => $visible,
|
|
'secondary' => $secondary
|
|
);
|
|
|
|
if( FALSE !== WPF()->db->update(
|
|
WPF()->tables->usergroups,
|
|
$group,
|
|
array('groupid' => $groupid),
|
|
array('%s','%s','%s','%s','%s','%s','%s','%d','%d'),
|
|
array('%d')
|
|
)){
|
|
$group['groupid'] = $groupid;
|
|
|
|
do_action('wpforo_after_edit_usergroup', $group);
|
|
|
|
WPF()->notice->add('User group successfully edited', 'success');
|
|
return $groupid;
|
|
}
|
|
}
|
|
|
|
WPF()->notice->add('User group edit error', 'error');
|
|
return FALSE;
|
|
}
|
|
|
|
function delete($groupid, $mergeid){
|
|
if( !WPF()->perm->usergroup_can('vmg') ){
|
|
WPF()->notice->add('Permission denied', 'error');
|
|
return FALSE;
|
|
}
|
|
|
|
if( ($groupid = intval($groupid)) && !in_array($groupid, array(1,4)) ){
|
|
if( $mergeid = intval($mergeid) ){
|
|
$sql = "UPDATE `".WPF()->tables->profiles."` SET `groupid` = %d WHERE `groupid` = %d";
|
|
WPF()->db->query( WPF()->db->prepare($sql, $mergeid, $groupid) );
|
|
}
|
|
|
|
if( false !== WPF()->db->delete(
|
|
WPF()->tables->usergroups,
|
|
array('groupid' => $groupid),
|
|
array('%d')
|
|
)){
|
|
WPF()->notice->add(wpforo_phrase('Usergroup has been successfully deleted. All users of this usergroup have been moved to the usergroup you\'ve chosen', false), 'success');
|
|
return $groupid;
|
|
}
|
|
}
|
|
|
|
WPF()->notice->add('Can\'t delete this Usergroup', 'error');
|
|
return false;
|
|
}
|
|
|
|
function get_usergroup( $groupid = 4 ){
|
|
// Guest UsergroupID = 4
|
|
$cache = WPF()->cache->on('memory_cashe');
|
|
if( $cache && isset(self::$cache['usergroup'][$groupid]) ){
|
|
return self::$cache['usergroup'][$groupid];
|
|
}
|
|
$usergroup = WPF()->db->get_row("SELECT * FROM `".WPF()->tables->usergroups."` WHERE `groupid` = ".intval($groupid), ARRAY_A);
|
|
if($cache && isset($groupid)){
|
|
self::$cache['usergroup'][$groupid] = $usergroup;
|
|
}
|
|
return $usergroup;
|
|
}
|
|
|
|
function get_usergroups( $field = 'full' ){
|
|
$cache = WPF()->cache->on('memory_cashe');
|
|
if( $cache && isset(self::$cache['usergroups'][$field]) ) return self::$cache['usergroups'][$field];
|
|
|
|
if( $field == 'full' ){
|
|
$results = WPF()->db->get_results("SELECT * FROM `".WPF()->tables->usergroups."`", ARRAY_A);
|
|
}else{
|
|
$results = WPF()->db->get_col("SELECT `$field` FROM `".WPF()->tables->usergroups."`");
|
|
}
|
|
|
|
if( $cache ) self::$cache['usergroups'][$field] = $results;
|
|
return $results;
|
|
}
|
|
|
|
function get_groupid_by_userid( $userid ){
|
|
$cache = WPF()->cache->on('memory_cashe');
|
|
if( $cache && isset(self::$cache['user'][$userid]) ){
|
|
return self::$cache['user'][$userid];
|
|
}
|
|
$groupid = WPF()->db->get_var("SELECT `groupid` FROM `".WPF()->tables->profiles."` WHERE `userid` = " . intval($userid));
|
|
if($cache && isset($groupid)){
|
|
self::$cache['user'][$userid] = $groupid;
|
|
}
|
|
return $groupid;
|
|
}
|
|
|
|
function get_second_groupid_by_userid( $userid ){
|
|
$cache = WPF()->cache->on('memory_cashe');
|
|
if( $cache && isset(self::$cache['user_second'][$userid]) ){
|
|
return self::$cache['user_second'][$userid];
|
|
}
|
|
$second_groupid = WPF()->db->get_var("SELECT `secondary_groups` FROM `".WPF()->tables->profiles."` WHERE `userid` = " . intval($userid));
|
|
if($cache && isset($second_groupid)){
|
|
self::$cache['user_second'][$userid] = $second_groupid;
|
|
}
|
|
return $second_groupid;
|
|
}
|
|
|
|
/**
|
|
* @param array|int $selected
|
|
* @param array|int $exclude
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_selectbox($selected = array(), $exclude = array() ){
|
|
$selected = array_map('intval', (array) $selected );
|
|
$exclude = array_map('intval', (array) $exclude );
|
|
$html = '';
|
|
foreach($this->usergroup_list_data() as $group){
|
|
if( in_array($group['groupid'], $exclude) ) continue;
|
|
$html .= sprintf('<option value="%1$s" %2$s>%3$s</option>',
|
|
intval($group['groupid']),
|
|
in_array($group['groupid'], $selected) ? ' selected ' : '',
|
|
esc_html($group['name'])
|
|
);
|
|
}
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* @param array|int $selected
|
|
* @param array|int $exclude
|
|
*/
|
|
public function show_selectbox($selected = array(), $exclude = array()){
|
|
echo $this->get_selectbox($selected, $exclude);
|
|
}
|
|
|
|
function get_visible_usergroup_ids(){
|
|
return (array) WPF()->db->get_col("SELECT `groupid` FROM `".WPF()->tables->usergroups."` WHERE `visible` = 1");
|
|
}
|
|
|
|
function get_secondary_usergroup_ids(){
|
|
return (array) WPF()->db->get_col("SELECT `groupid` FROM `".WPF()->tables->usergroups."` WHERE `groupid` NOT IN(1,2,4) AND `secondary` = 1");
|
|
}
|
|
|
|
function get_secondary_usergroup_names( $ids ){
|
|
if( !is_array($ids) ) $ids = explode( ',', $ids );
|
|
$ids = array_map('intval', $ids);
|
|
$ids = array_diff($ids, array(1,2,4));
|
|
if( $ids ){
|
|
$ids = implode(',', $ids);
|
|
return (array) WPF()->db->get_col("SELECT `name` FROM `".WPF()->tables->usergroups."` WHERE `secondary` = 1 AND `groupid` IN (" . esc_sql( $ids ) . ")");
|
|
}
|
|
return array();
|
|
}
|
|
|
|
function get_secondary_usergroups(){
|
|
return (array) WPF()->db->get_results("SELECT * FROM `".WPF()->tables->usergroups."` WHERE `groupid` NOT IN(1,2,4) AND `secondary` = 1", ARRAY_A);
|
|
}
|
|
|
|
function get_usergroups_by_role( $role ){
|
|
if( $role ){
|
|
$ugids = WPF()->db->get_col("SELECT `groupid` FROM `" . WPF()->tables->usergroups . "` WHERE `role` = '" . esc_sql($role) . "' ORDER BY `groupid` ASC");
|
|
if( !empty($ugids) ){
|
|
return $ugids;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
function get_roles(){
|
|
$roles = wp_roles();
|
|
$roles = $roles->get_names();
|
|
return $roles;
|
|
}
|
|
|
|
function get_roles_ug(){
|
|
$roles_ug = WPF()->db->get_results("SELECT `name`, `role` FROM `" . WPF()->tables->usergroups . "`", ARRAY_A);
|
|
$roles = wp_roles();
|
|
$roles = $roles->get_names();
|
|
if(!empty( $roles )){
|
|
foreach($roles as $role => $name){
|
|
foreach($roles_ug as $ug){
|
|
if( wpfval($ug, 'role') && $role == $ug['role'] ){
|
|
$roles_ug[$role][] = $ug['name'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $roles_ug;
|
|
}
|
|
|
|
function get_roles_woug(){
|
|
$roles_woug = array();
|
|
$roles_ug = WPF()->db->get_col("SELECT `role` FROM `" . WPF()->tables->usergroups . "` GROUP BY `role`");
|
|
$roles = wp_roles();
|
|
$roles = $roles->get_names();
|
|
if(!empty( $roles )){
|
|
foreach($roles as $role => $name){
|
|
if( !in_array($role, $roles_ug) ){
|
|
$roles_woug[$role] = $name;
|
|
}
|
|
}
|
|
}
|
|
return $roles_woug;
|
|
}
|
|
|
|
function get_role_usergroup_relation(){
|
|
$roles = array();
|
|
$data = WPF()->db->get_results("SELECT `groupid`, `role` FROM `" . WPF()->tables->usergroups . "` ORDER BY `groupid` DESC", ARRAY_A);
|
|
if(!empty( $data )){
|
|
foreach($data as $rel){
|
|
if( $rel['groupid'] == 1 && in_array($rel['role'], array('subscriber', 'contributor') ) ){
|
|
$roles['administrator'] = $rel['groupid'];
|
|
} elseif( $rel['groupid'] == 2 && $rel['role'] == 'subscriber' ) {
|
|
$roles['editor'] = $rel['groupid'];
|
|
} elseif( $rel['role'] ) {
|
|
$roles[ $rel['role'] ] = $rel['groupid'];
|
|
}
|
|
}
|
|
}
|
|
return $roles;
|
|
}
|
|
|
|
function get_usergroup_role_relation(){
|
|
$usergroups = array();
|
|
$data = WPF()->db->get_results("SELECT `groupid`, `role` FROM `" . WPF()->tables->usergroups . "`", ARRAY_A);
|
|
if(!empty( $data )){
|
|
foreach($data as $rel){
|
|
$usergroups[ $rel['groupid'] ] = $rel['role'];
|
|
}
|
|
}
|
|
return $usergroups;
|
|
}
|
|
|
|
function set_ug_roles( $ug_role ){
|
|
if( !empty($ug_role) ){
|
|
foreach( $ug_role as $usergroupid => $role ){
|
|
$role = sanitize_text_field($role);
|
|
WPF()->db->query("UPDATE " . WPF()->tables->usergroups . " SET `role` = '" . esc_sql($role) . "' WHERE `groupid` = " . intval($usergroupid) );
|
|
}
|
|
}
|
|
}
|
|
|
|
function set_users_groupid( $groupid_userids ){
|
|
$status = array('error' => 0, 'success' => false );
|
|
if( !empty($groupid_userids) ){
|
|
foreach( $groupid_userids as $group_id => $user_ids ){
|
|
if( $group_id && !empty($user_ids) ){
|
|
$userids = implode(',', $user_ids);
|
|
$sql = "UPDATE " . WPF()->tables->profiles ." SET `groupid` = " . intval($group_id) . " WHERE `userid` IN(" . esc_sql($userids) . ")";
|
|
if( FALSE === WPF()->db->query($sql) ){
|
|
$status['error'] = WPF()->db->last_error;
|
|
$status['success'] = false;
|
|
break;
|
|
}
|
|
else{
|
|
$status['success'] = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $status;
|
|
}
|
|
|
|
function build_users_groupid_array( $usergroupid_role, $users ){
|
|
$array = array();
|
|
$group_users = array();
|
|
$user_prime_group = array();
|
|
$user_second_groups = array();
|
|
if( !empty($users) ){
|
|
foreach( $users as $user ){
|
|
if( !empty($user->roles) ){
|
|
foreach( $user->roles as $role ) {
|
|
$ugids = wpforo_key($usergroupid_role, $role, 'sort');
|
|
$ug_count = count($ugids);
|
|
if(!empty($ugids)){
|
|
foreach($ugids as $ugid){
|
|
if( $ug_count == 1 ){
|
|
if( !isset($user_prime_group[$user->ID]) ) {
|
|
$user_prime_group[$user->ID][] = $ugid;
|
|
$group_users[$ugid][] = intval($user->ID);
|
|
}
|
|
else{
|
|
$user_second_groups[$user->ID][] = $ugid;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$array['group_users'] = $group_users;
|
|
$array['user_prime_group'] = $user_prime_group;
|
|
$array['user_second_groups'] = $user_second_groups;
|
|
return $array;
|
|
}
|
|
|
|
public function after_add_edit_usergroup($group){
|
|
if( wpforo_feature('role-synch') ){
|
|
$limit = apply_filters('wpforo_synch_roles_users_limit', 5000);
|
|
$users = get_users( array('role' => $group['role'], 'number' => $limit) );
|
|
if( !empty($users) ){
|
|
if( count($users) <= $limit ){
|
|
$status = wpforo_synch_role( array( $group['groupid'] => $group['role']), $users );
|
|
wpforo_clean_cache('user');
|
|
if( $error = wpfval($status, 'error') ){
|
|
WPF()->notice->add($error, 'error');
|
|
}
|
|
}else{
|
|
WPF()->notice->add('Please make sure you don\'t have not-synched Roles in the "User Roles" table below, then click on the [Synchronize] button to update users Usergroup IDs.' , 'error');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |