Быстрое переключение между указанными пользователями

При разработке удобно иметь на виду ссылки, по которым легко можно переключаться между пользователями. Особенно это удобно, если эти пользователи разных ролей и их нужно протестировать.

Данное решение использовать только при разработке, иначе любой с доступом в админку сможет переключаться между выбранными пользователями.

Код работает совместно с плагином User Switching.

<?php

/**
 * Разрешает быстро переключаться между разными ролями
 *
 * @requires User Switching WP plugin.
 */
final class Fast_Role_Switching {

	private const KEY_USERS_EMAILS = [
		'admin@site.com',          // Админ
		'editor_main@site.com',    // Редактор любого контента
		'editor_news@site.com',    // Редактор новостей и школ
		'editor-shcool@site.com',  // Редактор школы
		'editor_courses@site.com', // Редактор курсов-программ
	];

	public static function init(): void {
		global $user_switching;

		if ( ! $user_switching || ! method_exists( 'user_switching', 'maybe_switch_url' ) ) {
			return;
		}

		remove_action( 'all_admin_notices', [ $user_switching, 'action_admin_notices' ], 1 );

		add_action( 'admin_notices', [ __CLASS__, 'admin_notice' ], 1 );
		add_filter( 'user_has_cap', [ __CLASS__, 'add_user_cap' ], 99, 4 );
	}

	public static function admin_notice(): void {

		$links  = [];

		foreach ( self::KEY_USERS_EMAILS as $email ) {
			$user = get_user_by( 'email', $email );
			$url  = wp_get_current_user()->user_email === $email ? '' : user_switching::switch_to_url( $user );

			if ( $url ) {
				$links[] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $url ), esc_html( $user->display_name ) );
			} else {
				$links[] = sprintf( '<b>%1$s</b>', esc_html( $user->display_name ) );
			}
		}

		if ( ! $links ) {
			return;
		}

		?>
		<div class="updated notice notice-success is-dismissible">
			<p><?= implode( ', ', $links ) ?></p>
		</div>
		<?php
	}

	public static function add_user_cap( $allcaps, $caps, $args, $user ) {

		if ( 'switch_to_user' === $args[0] ) {
			$allcaps['switch_users']   = true;
			$allcaps['switch_to_user'] = true;
			$allcaps['switch_off']     = true;
		}

		return $allcaps;
	}

}

Запускаем код.

Запускать этот код в продакшн среде не в коем случе нельзя, поэтому для запуска нужно условие в какой среде разработки мы находимся:

// Разрешает быстро переключаться между разными ролями
if ( in_array( wp_get_environment_type(), [ 'local', 'development' ], true ) ) {
	add_action( 'init', [ Fast_Role_Switching::class, 'init' ] );
}

Или можете использовать свою константу, которая определяет среду разработки:

// Разрешает быстро переключаться между разными ролями
if ( defined( 'WP_LOCAL_DEV' ) && WP_LOCAL_DEV ) {
	add_action( 'after_setup_theme', [ Fast_Role_Switching::class, 'init' ] );
}