display_registration_date = Module_Registry::is_enabled( 'user_registration_date' );
$this->user_login_tracking = Module_Registry::is_enabled( 'user_login_tracking' );
if ( $this->display_registration_date || $this->user_login_tracking ) {
add_filter( 'manage_users_columns', [ $this, 'add_user_custom_columns' ] );
add_action( 'manage_users_custom_column', [ $this, 'render_user_custom_columns' ], 10, 3 );
add_filter( 'request', [ $this, 'user_custom_column_orderby' ] );
}
if ( $this->display_registration_date ) {
add_filter( 'manage_users_sortable_columns', [ $this, 'add_user_custom_column_sortable' ] );
}
if ( $this->user_login_tracking ) {
add_action( 'wp_login', [ $this, 'user_last_login' ], 10, 2 );
}
if ( Module_Registry::is_enabled( 'disable_user_signup_notification' ) ) {
add_action(
'init',
function () {
remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications' );
}
);
}
if ( Module_Registry::is_enabled( 'hide_update_notice' ) ) {
add_action( 'admin_head', [ $this, 'hide_update_notice_to_all_but_admin_users' ], 1 );
}
$this->migrate_legacy_hide_admin_toolbar_toggle();
$this->migrate_legacy_block_admin_access_toggle();
add_filter(
'adminoptim_notification_message_' . self::SECTION_ID,
static function ( string $message, string $display ): string {
if ( 'banner' === $display ) {
return $message;
}
if ( ! Module_Registry::is_pro_active() ) {
return sprintf(
/* translators: 1: Opening strong tag, 2: Closing strong tag. */
__(
'%1$sUnlock advanced user controls.%2$s Get more powerful role, capability, access, and user-management features with Admin Optimizer Pro.',
'admin-optimizer'
),
'',
''
);
}
return $message;
},
10,
2
);
add_filter(
'adminoptim_notification_banner_content_' . self::SECTION_ID,
static function (): array {
$content = [
[
'message' => sprintf(
/* translators: 1: Opening strong tag, 2: Closing strong tag. */
__( '%1$sBetter control over users, roles, access and everyday account management.%2$s Leave a ★★★★★ review on WordPress.org and help others manage WordPress users with less friction.', 'admin-optimizer' ),
'',
''
),
'cta_type' => 'review',
],
[
'message' => sprintf(
/* translators: 1: Opening strong tag, 2: Closing strong tag. */
__( '%1$sHaving issues with Admin Optimizer user or access tools?%2$s', 'admin-optimizer' ),
'',
''
),
'cta_type' => 'support',
],
];
return $content[ wp_rand( 0, 1 ) ];
},
);
}
/**
* Move the legacy Hide Admin Toolbar toggle into per-role User Access Manager settings.
*
* @return void
*/
private function migrate_legacy_hide_admin_toolbar_toggle() {
$options = get_option( MODULES_OPTION, [] );
$options = is_array( $options ) ? $options : [];
if ( empty( $options['hide_admin_toolbar'] ) ) {
return;
}
$uam_option_name = Module_Registry::get_option_name( 'user_access_manager' );
if ( null === $uam_option_name ) {
return;
}
$uam_options = get_option( $uam_option_name, [] );
$uam_options = is_array( $uam_options ) ? $uam_options : [];
if ( empty( $uam_options['role_settings'] ) || ! is_array( $uam_options['role_settings'] ) ) {
$uam_options['role_settings'] = [];
}
$wp_roles = wp_roles();
$roles = isset( $wp_roles->roles ) && is_array( $wp_roles->roles ) ? array_keys( $wp_roles->roles ) : [];
foreach ( $roles as $role ) {
$role = sanitize_key( (string) $role );
if ( empty( $role ) ) {
continue;
}
if ( empty( $uam_options['role_settings'][ $role ] ) || ! is_array( $uam_options['role_settings'][ $role ] ) ) {
$uam_options['role_settings'][ $role ] = [];
}
$uam_options['role_settings'][ $role ]['show_admin_bar'] = 0;
}
update_option( $uam_option_name, $uam_options );
unset( $options['hide_admin_toolbar'] );
update_option( MODULES_OPTION, $options );
}
/**
* Move the legacy Block Admin Access module toggle into User Access Manager.
*
* @return void
*/
private function migrate_legacy_block_admin_access_toggle() {
$options = get_option( MODULES_OPTION, [] );
$options = is_array( $options ) ? $options : [];
if ( empty( $options['block_admin_access'] ) ) {
return;
}
unset( $options['block_admin_access'] );
update_option( MODULES_OPTION, $options );
}
/**
* Check user last login
*
* @param string $user_login User's username.
* @param \WP_User $user WP_User class.
*
* @return void
*/
public function user_last_login( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', time() );
}
/**
* 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 false|string
*/
public function render_user_custom_columns( $value, $column_name, $user_id ) {
if ( 'registerdate' === $column_name ) {
$user = get_userdata( $user_id );
$registered = strtotime( get_date_from_gmt( $user->user_registered ) );
return '' . esc_html( wp_date( get_option( 'date_format' ), $registered ) ) . '
' . esc_html( wp_date( get_option( 'time_format' ), $registered ) ) . '';
} elseif ( 'lastlogin' === $column_name ) {
$last_login = (int) get_user_meta( $user_id, 'last_login', true );
$the_login_date = wp_date( 'd M Y, H:i:s', $last_login );
if ( empty( $the_login_date ) || empty( $last_login ) ) {
$the_login_date = 'Never';
}
return $the_login_date;
} else {
return $value;
}
}
/**
* Add custom colums to Users page.
*
* @param array $columns Columns.
*
* @return array
*/
public function add_user_custom_column_sortable( $columns ): array {
$custom = [];
if ( $this->display_registration_date ) {
$custom['registerdate'] = 'registered';
}
if ( ! empty( $custom ) ) {
return wp_parse_args( $custom, $columns );
} else {
return $columns;
}
}
/**
* Define custom column orderby
*
* @param array $vars Vars.
*
* @return mixed
*/
public function user_custom_column_orderby( $vars ) {
if ( isset( $vars['orderby'] ) && 'registerdate' === $vars['orderby'] ) {
$vars = array_merge(
$vars,
[
'meta_key' => 'registerdate', //phpcs:ignore
'orderby' => 'meta_value',
]
);
}
return $vars;
}
/**
* Add custom columns to Users page.
*
* @param array $columns All columns.
*
* @return array
*/
public function add_user_custom_columns( $columns ) {
if ( $this->display_registration_date ) {
$columns['registerdate'] = __( 'Registered', 'admin-optimizer' );
}
if ( $this->user_login_tracking ) {
$columns['lastlogin'] = __( 'Last Login', 'admin-optimizer' );
}
return $columns;
}
/**
* Hide update notice
*
* @return void
*/
public function hide_update_notice_to_all_but_admin_users() {
if ( ! current_user_can( 'update_core' ) ) {
remove_action( 'admin_notices', 'update_nag', 3 );
}
}
/**
* Ordinary module IDs this Section owns, mapped to their navigation labels.
*
* @return array
*/
protected function section_nav_modules(): array {
return [
'user_access_manager' => 'User Manager',
'disable_user_account' => 'Disable User Account',
'user_switching' => 'User Switching',
];
}
/**
* Section-owned "User Access Controls" presentation group of lightweight
* SECTION_FEATURE capabilities.
*
* @return array{label:string,description:string,members:array}
*/
protected function section_feature_group(): ?array {
return [
'label' => __( 'User Access Controls', 'admin-optimizer' ),
'description' => __( 'Manage user access and account behavior to better control how users interact with WordPress administration.', 'admin-optimizer' ),
'members' => [
'user_registration_date',
'user_login_tracking',
'disable_user_signup_notification',
'hide_update_notice',
],
];
}
}