settings = new Disable_User_Account_Settings();
add_filter( 'bulk_actions-users', [ $this, 'bulk_disable_user_accounts' ] );
add_action( 'restrict_manage_users', [ $this, 'add_nonce_field' ], 5 );
add_filter( 'handle_bulk_actions-users', [ $this, 'handle_bulk_disable_user_accounts' ], 10, 3 );
add_filter( 'manage_users_columns', [ $this, 'add_user_account_custom_columns' ] );
add_action( 'manage_users_custom_column', [ $this, 'render_user_account_custom_columns' ], 10, 3 );
add_filter( 'user_row_actions', [ $this, 'add_enable_disable_links' ], 10, 2 );
add_action( 'admin_post_adminoptim-disable-user-account', [ $this, 'disable_user_account' ] );
add_action( 'admin_post_adminoptim-enable-user-account', [ $this, 'enable_user_account' ] );
add_filter( 'wp_authenticate_user', [ $this, 'maybe_disable_login' ], 1 );
}
/**
* Bulk options to enable/disable user accounts
*
* @param array $bulk_actions // Bulk actions array.
*
* @return array
*/
public function bulk_disable_user_accounts( $bulk_actions ) {
$bulk_actions['adminoptim_enable_user_accounts'] = _x( 'Enable User Accounts', 'bulk action', 'admin-optimizer' );
$bulk_actions['adminoptim_disable_user_accounts'] = _x( 'Disable User Accounts', 'bulk action', 'admin-optimizer' );
return $bulk_actions;
}
/**
* Handler for bulk enabling/disabling user accounts
*
* @param string $redirect_url // Redirect url.
* @param string $action // Bulk action.
* @param array $user_ids // User ids.
*
* @return string
*/
public function handle_bulk_disable_user_accounts( $redirect_url, $action, $user_ids ) {
check_admin_referer( 'adminoptim-bulk-users', 'adminoptim-bulk-users-nonce' );
if ( 'adminoptim_enable_user_accounts' === $action || 'adminoptim_disable_user_accounts' === $action ) {
foreach ( $user_ids as $user_id ) {
if ( $this->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;
}
}