is_administrator( $user_id ) ) { continue; } $user_account_disabled = get_user_meta( $user_id, 'adminoptim_disable_account', true ); switch ( $action ) { case 'adminoptim_disable_user_accounts': if ( empty( $user_account_disabled ) ) { update_user_meta( $user_id, 'adminoptim_disable_account', true ); } break; case 'adminoptim_enable_user_accounts': if ( ! empty( $user_account_disabled ) && '1' === $user_account_disabled ) { delete_user_meta( $user_id, 'adminoptim_disable_account' ); } break; } } } return $redirect_url; } /** * Add custom columns to Users page. * * @param array $columns All columns. * * @return array */ public function add_user_account_custom_columns( $columns ) { if ( empty( $columns['adminoptim_account_status'] ) ) { $columns['adminoptim_account_status'] = __( 'User Account', 'admin-optimizer' ); } return $columns; } /** * Render Custom columns in User page * * @param string $value Custom column output. * @param string $column_name Column name. * @param int $user_id ID of the currently-listed user. * * @return string */ public function render_user_account_custom_columns( $value, $column_name, $user_id ) { if ( 'adminoptim_account_status' === $column_name ) { $user_account_disabled = get_user_meta( $user_id, 'adminoptim_disable_account', true ); $status = __( 'Active', 'admin-optimizer' ); if ( ! empty( $user_account_disabled ) && '1' === $user_account_disabled ) { $status = __( 'Disabled', 'admin-optimizer' ); } return esc_html( $status ); } else { return $value; } } /** * Add nonce field to Users page * * @return void */ public function add_nonce_field() { if ( ! current_user_can( 'edit_users' ) ) { return; } wp_nonce_field( 'adminoptim-bulk-users', 'adminoptim-bulk-users-nonce' ); } /** * Add links to quick row * * @param array $actions // Actions. * @param \WP_User $user // User object. * * @return array */ public function add_enable_disable_links( $actions, $user ) { if ( ! isset( $actions['adminoptim_user_can_login'] ) ) { if ( ! $this->is_administrator( $user->ID ) ) { $user_account_disabled = get_user_meta( $user->ID, 'adminoptim_disable_account', true ); if ( ! empty( $user_account_disabled ) && '1' === $user_account_disabled ) { // user account is already disabled, set the links to enable user account. $actions['adminoptim_user_can_login'] = sprintf( '' . __( 'Enable account', 'admin-optimizer' ) . '', $this->generate_link( [ 'action' => 'adminoptim-enable-user-account', 'user_id' => $user->ID, 'nonce' => wp_create_nonce( 'adminoptim-disable-user' . $user->ID . '-account' ), ] ) ); } else { // user account is enabled, set the links to disable user account. $actions['adminoptim_user_can_login'] = sprintf( '' . __( 'Disable account', 'admin-optimizer' ) . '', $this->generate_link( [ 'action' => 'adminoptim-disable-user-account', 'user_id' => $user->ID, 'nonce' => wp_create_nonce( 'adminoptim-disable-user' . $user->ID . '-account' ), ] ) ); } } } return $actions; } /** * Generate links to output in quick row * * @param array $query // Link args. * * @return string */ private function generate_link( array $query ) { $default = [ 'action' => 'adminoptim-disable-user-account', 'user_id' => 0, 'nonce' => wp_create_nonce( 'adminoptimizer-disable-user-account' ), ]; $query = shortcode_atts( $default, $query ); return esc_url( add_query_arg( $query, admin_url( 'admin-post.php?' ) ), null, '&' ); } /** * Function to disable user account * * @return void */ public function disable_user_account() { if ( ! current_user_can( 'edit_users' ) ) { wp_die( esc_html__( 'Unauthorized action.', 'admin-optimizer' ) ); } $user_id = isset( $_REQUEST['user_id'] ) ? (int) $_REQUEST['user_id'] : 0; if ( empty( $user_id ) ) { wp_die( esc_html__( 'No user found.', 'admin-optimizer' ) ); } elseif ( empty( $_GET['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['nonce'] ), 'adminoptim-disable-user' . $user_id . '-account' ) ) { wp_die( esc_html__( 'Unauthorized action.', 'admin-optimizer' ) ); } else { if ( ! $this->is_administrator( $user_id ) ) { update_user_meta( $user_id, 'adminoptim_disable_account', true ); } if ( wp_get_referer() ) { wp_safe_redirect( wp_get_referer() ); } else { wp_safe_redirect( admin_url( 'users.php' ) ); } } } /** * Function to enable user account * * @return void */ public function enable_user_account() { if ( ! current_user_can( 'edit_users' ) ) { wp_die( esc_html__( 'Unauthorized action.', 'admin-optimizer' ) ); } $user_id = isset( $_REQUEST['user_id'] ) ? (int) $_REQUEST['user_id'] : 0; if ( empty( $user_id ) ) { wp_die( esc_html__( 'No user found.', 'admin-optimizer' ) ); } elseif ( empty( $_GET['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['nonce'] ), 'adminoptim-disable-user' . $user_id . '-account' ) ) { wp_die( esc_html__( 'Unauthorized action.', 'admin-optimizer' ) ); } else { delete_user_meta( $user_id, 'adminoptim_disable_account' ); if ( wp_get_referer() ) { wp_safe_redirect( wp_get_referer() ); } else { wp_safe_redirect( admin_url( 'users.php' ) ); } } } /** * Authenticate user login and disable user account if necessary * * @param \WP_Error|\WP_User $user // User object. * * @return \WP_Error|\WP_User */ public function maybe_disable_login( $user ) { if ( is_wp_error( $user ) ) { return $user; } if ( isset( $user->ID ) ) { if ( ! $this->is_administrator( $user->ID ) ) { $is_account_disabled = get_user_meta( $user->ID, 'adminoptim_disable_account', true ); if ( ! empty( $is_account_disabled ) && '1' === $is_account_disabled ) { // should return \WP_Error instead? wp_die( esc_html__( 'ERROR: This user account is disabled.', 'admin-optimizer' ) ); } } } return $user; } }