Temporarily disable user role login and replace with message
-
22-04-2021 - |
Question
Is there a simple way to temporarily stop a user role logging in with wordpress?
For example, if I have a user role called media, how can I block them from logging in?
I would like a custom message to appear on the website, for example like 'Site undergoing maintenance'
So it looks like this:
The reason why, is because my website is completely locked down from the public using this function...
// LOCK DOWN
add_action('get_header', 'wpq_member_only_site');
function wpq_member_only_site() {
// logged in users or visits to a specified page are allowed
if ( !is_user_logged_in() ) {
$redirect_after_login = get_home_url();
// the URL where login/registration takes place
$login_url = wp_login_url( $redirect_after_login );
// redirect visitors
wp_redirect( $login_url, 302 );
exit;
}
}
But I need to do some maintenance and I'm after a simple way to lock all users out that are the role media.
This is because I wan't administrators and editors to still have access, but not media.
Solution
With a some digging and learning, I managed to combine various help and create these 2 functions...
// MAINTAINANCE MODE
function site_maintenance() {
if ( current_user_can('media') || current_user_can('genpo') ) {
$logout_url = wp_login_url().'?mode=maintainance';
wp_logout();
wp_redirect( $logout_url, 302 );
}
}
add_action('get_header', 'site_maintenance');
// CUSTOM LOGIN MESSAGES
function my_login_message() {
if( $_GET['mode'] == 'maintainance' ){
$message = '<p class="message"><b>Site undergoing maintainance.</b></p>';
return $message;
}
}
add_filter('login_message', 'my_login_message');
OTHER TIPS
Add in a check for a capability that admins and editors share:
add_action( 'get_header', 'wpse81659_maintenance' );
function wpse81659_maintenance() {
if ( ! current_user_can( 'publish_pages' ) || ! is_user_logged_in() )
die( 'Site undergoing maintenance' );
}