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', ], ]; } }