# password-reset-enforcement/trunk/src/modules/reset-indicator/class-module-reset-indicator.php

Teydea Password Reset – Force Password Reset &amp; Expiration, version trunk. 185 lines.

- Page: https://pluginprobe.com/plugins/password-reset-enforcement/trunk/code/src/modules/reset-indicator/class-module-reset-indicator.php
- Raw: https://pluginprobe.com/plugins/password-reset-enforcement/trunk/raw/src/modules/reset-indicator/class-module-reset-indicator.php
- Modified: 2026-08-27T22:13:58+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/password-reset-enforcement/trunk/code/src/modules/reset-indicator/class-module-reset-indicator.php#L10-L20`.

```php
<?php
/**
 * Add indicator to show that a password reset has been
 * enforced for the user
 *
 * @package Teydea_Studio\Password_Reset
 */

namespace Teydea_Studio\Password_Reset\Modules\Reset_Indicator;

use Teydea_Studio\Password_Reset\Dependencies\Utils;
use Teydea_Studio\Password_Reset\User;
use WP_User;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // @codeCoverageIgnore
}

/**
 * The "Module_Reset_Indicator" class
 */
final class Module_Reset_Indicator extends Utils\Module {
	/**
	 * Column slug
	 *
	 * @var string
	 */
	const COLUMN_SLUG = 'password_reset_enforcement__status';

	/**
	 * Register hooks
	 *
	 * @return void
	 */
	public function register(): void {
		// Add custom column to the multisite users list table.
		add_filter( 'wpmu_users_columns', [ $this, 'add_custom_column' ] );

		// Add custom column to the single-site users list table.
		add_filter( 'manage_users_columns', [ $this, 'add_custom_column' ] );

		// Render the content of the custom column.
		add_filter( 'manage_users_custom_column', [ $this, 'render_custom_column' ], 10, 3 );

		// Enqueue the column's stylesheet on the users list table.
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );

		// Register the admin notice on network admin user profile.
		add_action( 'network_admin_notices', [ $this, 'maybe_register_admin_notice' ] );

		// Register the admin notice on single-site user profile.
		add_action( 'admin_notices', [ $this, 'maybe_register_admin_notice' ] );
	}

	/**
	 * Enqueue the column stylesheet on the users list table
	 *
	 * @return void
	 */
	public function enqueue_assets(): void {
		$screen = new Utils\Screen( $this->container );

		if ( $screen->is( 'users' ) || $screen->is( 'users-network' ) ) {
			$asset = new Utils\Asset( $this->container, 'reset-indicator' );
			$asset->enqueue_style();
		}
	}

	/**
	 * Add custom column to the users list table
	 *
	 * @param array<string,string> $columns Existing columns.
	 *
	 * @return array<string,string> Modified columns.
	 */
	public function add_custom_column( array $columns ): array {
		// Get the current user.
		$current_user = new User( $this->container );

		// Ensure current user has the managing permissions.
		if ( $current_user->has_managing_permissions() ) {
			$columns[ self::COLUMN_SLUG ] = __( 'Password Reset Enforced?', 'password-reset-enforcement' );
		}

		return $columns;
	}

	/**
	 * Render the content of the custom column
	 *
	 * @param string $value       The column value.
	 * @param string $column_name The column name.
	 * @param int    $user_id     The user ID.
	 *
	 * @return string The modified column value.
	 */
	public function render_custom_column( string $value, string $column_name, int $user_id ): string {
		if ( self::COLUMN_SLUG === $column_name ) {
			$wp_user = get_user_by( 'ID', $user_id );

			if ( $wp_user instanceof WP_User ) {
				$user = new User( $this->container, $wp_user );

				if ( false === $user->is_password_reset_required() ) {
					$value = sprintf( '<p class="password-reset-enforcement-reset-indicator__status">%s</p>', esc_html__( 'No', 'password-reset-enforcement' ) );
				} else {
					$value = sprintf( '<p class="password-reset-enforcement-reset-indicator__status password-reset-enforcement-reset-indicator__status--enforced">%s</p>', esc_html__( 'Yes', 'password-reset-enforcement' ) );
					$data  = $user->get_password_reset_request_data();

					if ( null !== $data ) {
						$items = [
							__( 'Requested at:', 'password-reset-enforcement' ) => sprintf(
								// Translators: %1$s - timestamp, %2$s - human-readable time difference.
								__( '%1$s (%2$s ago)', 'password-reset-enforcement' ),
								Utils\Date_Time::get_i18n_datetime_string( $data['requested_at'] ),
								human_time_diff( $data['requested_at'] ),
							),
							__( 'Requestor:', 'password-reset-enforcement' ) => $user->get_requestor_display_name( $data['requested_by'] ),
						];

						$value .= '<ul class="password-reset-enforcement-reset-indicator__details">';

						foreach ( $items as $label => $item ) {
							$value .= sprintf( '<li><strong class="password-reset-enforcement-reset-indicator__detail-label">%s</strong> %s</li>', esc_html( $label ), esc_html( $item ) );
						}

						$value .= '</ul>';
					}
				}
			}
		}

		return $value;
	}

	/**
	 * Maybe register the admin notice
	 *
	 * @return void
	 */
	public function maybe_register_admin_notice(): void {
		$screen = new Utils\Screen( $this->container );

		if ( ! $screen->is( 'user-edit' ) ) {
			return;
		}

		$user_id = isset( $_GET['user_id'] ) ? Utils\Type::ensure_int( wp_unslash( $_GET['user_id'] ) ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

		if ( 0 === $user_id ) {
			return;
		}

		$wp_user = get_user_by( 'ID', $user_id );

		if ( $wp_user instanceof WP_User ) {
			$user = new User( $this->container, $wp_user );

			if ( $user->is_password_reset_required() ) {
				$data = $user->get_password_reset_request_data();

				if ( null === $data ) {
					return;
				}

				$requestor = $user->get_requestor_display_name( $data['requested_by'] );

				// Register the admin notice.
				wp_admin_notice(
					wp_kses(
						sprintf(
							// Translators: %1$s - user display name, %2$s - human-readable time difference.
							__( 'A password reset was enforced for this user by <strong>%1$s %2$s ago</strong>, but they have not completed it yet. Please make sure they are informed.', 'password-reset-enforcement' ),
							$requestor,
							human_time_diff( $data['requested_at'] ),
						),
						[ 'strong' => [] ],
					),
					[ 'type' => 'info' ],
				);
			}
		}
	}
}

```
