Быстрое переключение между указанными пользователями
При разработке удобно иметь на виду ссылки, по которым легко можно переключаться между пользователями. Особенно это удобно, если эти пользователи разных ролей и их нужно протестировать.
Данное решение использовать только при разработке, иначе любой с доступом в админку сможет переключаться между выбранными пользователями.
Код работает совместно с плагином 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' ] );
}