admin()->check_ajax_nonce();
$search_request = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : '';
$page = ! empty( $_REQUEST['page'] ) ? absint( $_REQUEST['page'] ) : 1;
$per_page = 20;
$args = array(
'fields' => array( 'ID', 'user_login' ),
'paged' => $page,
'number' => $per_page,
);
if ( ! empty( $search_request ) ) {
$args['search'] = '*' . $search_request . '*';
}
$args = apply_filters( 'um_get_users_list_ajax_args', $args );
$users_query = new \WP_User_Query( $args );
$users = $users_query->get_results();
$total_count = $users_query->get_total();
if ( ! empty( $_REQUEST['avatar'] ) ) {
foreach ( $users as $key => $user ) {
$url = get_avatar_url( $user->ID );
$users[ $key ]->img = $url;
}
}
wp_send_json_success(
array(
'users' => $users,
'total_count' => $total_count,
)
);
}
/**
* Restrict the edit/delete users via wp-admin screen by the UM role capabilities
*
* @param $allcaps
* @param $cap
* @param $args
* @param $user
*
* @return mixed
*/
public function map_caps_by_role( $allcaps, $cap, $args, $user ) {
if ( isset( $cap[0] ) && $cap[0] == 'edit_users' ) {
if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'edit_user' ) {
if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'edit', $args[2] ) ) {
$allcaps[ $cap[0] ] = false;
}
}
} elseif ( isset( $cap[0] ) && $cap[0] == 'delete_users' ) {
if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'delete_user' ) {
if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'delete', $args[2] ) ) {
$allcaps[ $cap[0] ] = false;
}
}
} elseif ( isset( $cap[0] ) && $cap[0] == 'list_users' ) {
if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'list_users' ) {
if ( ! um_user( 'can_view_all' ) ) {
$allcaps[ $cap[0] ] = false;
}
}
}
return $allcaps;
}
/**
* Does an action to user asap
*
* @param string $action
*/
public function user_action_hook( $action ) {
switch ( $action ) {
default:
/**
* UM hook
*
* @type action
* @title um_admin_custom_hook_{$action}
* @description Integration hook on user action
* @input_vars
* [{"var":"$user_id","type":"int","desc":"User ID"}]
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_custom_hook_{$action}', 'function_name', 10, 1 );
* @example
*
*/
do_action( "um_admin_custom_hook_{$action}", UM()->user()->id );
break;
case 'um_put_as_pending':
UM()->user()->pending();
break;
case 'um_approve_membership':
case 'um_reenable':
add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 );
add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 );
UM()->user()->approve();
break;
case 'um_reject_membership':
UM()->user()->reject();
break;
case 'um_resend_activation':
add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 );
add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 );
UM()->user()->email_pending();
break;
case 'um_deactivate':
UM()->user()->deactivate();
break;
case 'um_delete':
if ( is_admin() ) {
wp_die( __( 'This action is not allowed in backend.', 'ultimate-member' ) );
}
UM()->user()->delete();
break;
}
}
/**
* Add UM Bulk actions to Users List Table
*
*/
public function restrict_manage_users() {
?>
'My Custom Bulk Action'
* );
* return $actions;
* }
* ?>
*/
$actions = apply_filters( 'um_admin_bulk_user_actions_hook', array(
'um_approve_membership' => array(
'label' => __( 'Approve Membership', 'ultimate-member' )
),
'um_reject_membership' => array(
'label' => __( 'Reject Membership', 'ultimate-member' )
),
'um_put_as_pending' => array(
'label' => __( 'Put as Pending Review', 'ultimate-member' )
),
'um_resend_activation' => array(
'label' => __( 'Resend Activation E-mail', 'ultimate-member' )
),
'um_deactivate' => array(
'label' => __( 'Deactivate', 'ultimate-member' )
),
'um_reenable' => array(
'label' => __( 'Reactivate', 'ultimate-member' )
)
) );
$output = '';
foreach ( $actions as $id => $action_data ) {
$output .= '';
}
return $output;
}
/**
* Custom row actions for users page
*
* @param array $actions
* @param $user_object \WP_User
* @return array
*/
public function user_row_actions( $actions, $user_object ) {
$user_id = $user_object->ID;
$actions['frontend_profile'] = '' . __( 'View profile', 'ultimate-member' ) . '';
$submitted = get_user_meta( $user_id, 'submitted', true );
if ( ! empty( $submitted ) ) {
$actions['view_info'] = '' . __( 'Info', 'ultimate-member' ) . '';
}
if ( ! current_user_can( 'administrator' ) ) {
if ( ! um_can_view_profile( $user_id ) ) {
unset( $actions['frontend_profile'] );
unset( $actions['view_info'] );
unset( $actions['view'] );
}
}
/**
* UM hook
*
* @type filter
* @title um_admin_user_row_actions
* @description Admin views array
* @input_vars
* [{"var":"$actions","type":"array","desc":"User List Table actions"},
* {"var":"$user_id","type":"int","desc":"User ID"}]
* @change_log
* ["Since: 2.0"]
* @usage add_filter( 'um_admin_user_row_actions', 'function_name', 10, 2 );
* @example
*
*/
$actions = apply_filters( 'um_admin_user_row_actions', $actions, $user_id );
return $actions;
}
/**
* Change default sorting at WP Users list table
*
* @param array $args
* @return array
*/
public function hide_by_caps( $args ) {
if ( ! current_user_can( 'administrator' ) ) {
$can_view_roles = um_user( 'can_view_roles' );
if ( um_user( 'can_view_all' ) && ! empty( $can_view_roles ) ) {
$args['role__in'] = $can_view_roles;
}
}
return $args;
}
/**
* Change default sorting at WP Users list table
*
* @param $query
* @return mixed
*/
public function sort_by_newest( $query ) {
global $pagenow;
if ( is_admin() && 'users.php' === $pagenow ) {
if ( ! isset( $_REQUEST['orderby'] ) ) {
$query->query_vars['order'] = 'desc';
$query->query_orderby = ' ORDER BY user_registered ' . ( 'desc' === $query->query_vars['order'] ? 'desc ' : 'asc ' ); //set sort order
}
}
return $query;
}
/**
* Filter WP users by UM Status
*
* @param $query
* @return mixed
*/
public function filter_users_by_status( $query ) {
global $wpdb, $pagenow;
if ( is_admin() && 'users.php' === $pagenow && ! empty( $_REQUEST['um_status'] ) ) {
$status = sanitize_key( $_REQUEST['um_status'] );
if ( 'needs-verification' === $status ) {
$query->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID IN (
SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta
WHERE {$wpdb->usermeta}.meta_key = '_um_verified'
AND {$wpdb->usermeta}.meta_value = 'pending')",
$query->query_where
);
} else {
$query->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID IN (
SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta
WHERE {$wpdb->usermeta}.meta_key = 'account_status'
AND {$wpdb->usermeta}.meta_value = '{$status}')",
$query->query_where
);
}
}
return $query;
}
/**
* Add status links to WP Users List Table
*
* @param $views
* @return array
*/
public function add_status_links( $views ) {
remove_filter( 'pre_user_query', array( &$this, 'filter_users_by_status' ) );
$old_views = $views;
$views = array();
if ( ! isset( $_REQUEST['role'] ) && ! isset( $_REQUEST['um_status'] ) ) {
$views['all'] = '' . __( 'All', 'ultimate-member' ) . ' (' . UM()->query()->count_users() . ')';
} else {
$views['all'] = '' . __( 'All', 'ultimate-member' ) . ' (' . UM()->query()->count_users() . ')';
}
$status = array(
'approved' => __( 'Approved', 'ultimate-member' ),
'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ),
'awaiting_email_confirmation' => __( 'Waiting e-mail confirmation', 'ultimate-member' ),
'inactive' => __( 'Inactive', 'ultimate-member' ),
'rejected' => __( 'Rejected', 'ultimate-member' ),
);
// set default statuses if not already done
UM()->setup()->set_default_user_status();
foreach ( $status as $k => $v ) {
if ( isset( $_REQUEST['um_status'] ) && sanitize_key( $_REQUEST['um_status'] ) === $k ) {
$current = 'class="current"';
} else {
$current = '';
}
$views[ $k ] = '' . $v . ' (' . UM()->query()->count_users_by_status( $k ) . ')';
}
/**
* UM hook
*
* @type filter
* @title um_admin_views_users
* @description Admin views array
* @input_vars
* [{"var":"$views","type":"array","desc":"User Views"}]
* @change_log
* ["Since: 2.0"]
* @usage add_filter( 'um_admin_views_users', 'function_name', 10, 1 );
* @example
*
*/
$views = apply_filters( 'um_admin_views_users', $views );
// remove all filters
unset( $old_views['all'] );
// add separator
$views['subsep'] = '';
// merge views
foreach ( $old_views as $key => $view ) {
$views[ $key ] = $view;
}
// hide filters with not accessible roles
if ( ! current_user_can( 'administrator' ) ) {
$wp_roles = wp_roles();
$can_view_roles = um_user( 'can_view_roles' );
if ( ! empty( $can_view_roles ) ) {
foreach ( $wp_roles->get_names() as $this_role => $name ) {
if ( ! in_array( $this_role, $can_view_roles, true ) ) {
unset( $views[ $this_role ] );
}
}
}
}
return $views;
}
/**
* Bulk user editing actions
*/
public function um_bulk_users_edit() {
// bulk edit users
if ( ! empty( $_REQUEST['users'] ) && ! empty( $_REQUEST['um_bulkedit'] ) && ! empty( $_REQUEST['um_bulk_action'] ) ) {
$rolename = UM()->roles()->get_priority_user_role( get_current_user_id() );
$role = get_role( $rolename );
if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) {
wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) );
}
check_admin_referer( 'bulk-users' );
$users = array_map( 'absint', (array) $_REQUEST['users'] );
$bulk_action = current( array_filter( $_REQUEST['um_bulk_action'] ) );
foreach ( $users as $user_id ) {
UM()->user()->set( $user_id );
/**
* UM hook
*
* @type action
* @title um_admin_user_action_hook
* @description Action on bulk user action
* @input_vars
* [{"var":"$bulk_action","type":"string","desc":"Bulk Action"}]
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_user_action_hook{$action}', 'function_name', 10, 1 );
* @example
*
*/
do_action( 'um_admin_user_action_hook', $bulk_action );
/**
* UM hook
*
* @type action
* @title um_admin_user_action_{$bulk_action}_hook
* @description Action on bulk user action
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_user_action_{$bulk_action}_hook', 'function_name', 10 );
* @example
*
*/
do_action( "um_admin_user_action_{$bulk_action}_hook" );
}
$uri = $this->set_redirect_uri( admin_url( 'users.php' ) );
$uri = add_query_arg( 'update', 'um_users_updated', $uri );
wp_redirect( $uri );
exit;
} elseif ( ! empty( $_REQUEST['um_bulkedit'] ) ) {
$uri = $this->set_redirect_uri( admin_url( 'users.php' ) );
wp_redirect( $uri );
exit;
}
}
/**
* Sets redirect URI after bulk action
*
* @param string $uri
* @return string
*/
public function set_redirect_uri( $uri ) {
if ( ! empty( $_REQUEST['s'] ) ) {
$uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri );
}
if ( ! empty( $_REQUEST['um_status'] ) ) {
$uri = add_query_arg( 'um_status', sanitize_key( $_REQUEST['um_status'] ), $uri );
}
return $uri;
}
}
}