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